OCA/OCP Java Note (1): Java Building Blocks (1)

1. Understanding the Java Class Structure

1.1. Comments

  注释有以下三种形式,其中最后一种用于Javadoc:

  对于多行注释,在一组 /*  和 */ 之间的多行内容都会被作为注释,要小心 /* */ 不匹配的情况,如下面的代码无法编译:

第一行的 /* 和第二行末尾的 */ 配对,之间的 * /* ferret成为注释(注意这里第一个 */之间有一个空格),而第三行的 */ 没有与之相对的 /* ,导致编译错误。

1.2. Classes vs. Files

  多数情况下,Java类都被定义在自己的同名*.java文件中,且通常都是public的,表明任何代码都可以调用它。但Java并不强制要求每一个类都是public,如:

  也可以在同一个文件中定义多个类,但其中最多只能有一个类是public的:

  对于public的类,它的类名必须与文件名匹配,上面的例子在一个文件中定义了两个类,其中 Animal为public,则这个文件的文件名必须为Animal.java。

2. Writing a main() Method

  一个典型的main()函数如下:

  其参数列表为一个java.lang.String对象的列表,可以写成数组 String[] args 、 String args[] 或可变参数 String... args 的形式。

  下面的mian()函数会将其前两个参数打印出来:

编译并使用如下参数运行:

得到的打印为:

  两个参数用空格区分,如果想在一个参数中使用空格,需要将参数用双引号 "" 括起来:

得到的打印为:

  通过命令行传入的参数都被作为String对象:

得到的打印为:

这里的 2 为String而不是int。

  如果通过命令行给出的参数数量少于main()函数访问的参数,则在main()函数访问到命令行未给出的参数时,会发生java.lang.ArrayIndexOutOfBoundsException。

3. Understanding Package Declarations and Imports

3.1. Wildcards

  通配符(wildcard)用于一次性导入一个包中的所有类,如:

这里的 * 作为通配符,将导入java.util包中的所有类,包括java.util.Random等等,但不会导入子包(child packages)、字段(fields)或是方法(methods)。之后会涉及到静态导入(static import),允许导入其他类型。

3.2. Redundant Imports

  之前的例子在使用String时,并没有导入String所在的包java.lang,这是因为java.lang包会被自动导入,其余的包都需要手动导入。

  下面的例子使用了Files和Paths两个类:

Files和Path都位于java.nio.file包中,可以使用通配符导入:

也可以使用类名导入:

  但是,下面的导入方法都是不正确的:

3.3. Naming Conflicts

  不同的包下面可以存在具有相同名称的类,导入时需要注意避免命名冲突。下面的例子希望使用 java.util.Date:

与之前类似,导入java.util.Date可以使用如下两种方式:

或:

  有很多包中都有名叫Date的类,当这个类同时存在于多个被导入的包中时,会导致编译错误:

java.util和java.sql包中都有一个名叫Date的类,上面第二行在导入java.sql时会发生编译错误:The type Date is ambiguous。如果想同时使用java.util.Date和java.sql中的其他类,可以使用如下的方式:

第一行显式地指明了要导入java.util.Date,这种方式的优先级高于通配符。如果以相同的优先级导入两个命名冲突的类,同样会导致编译错误:

如果一定要同时使用java.util.Date和java.sql.Date,解决办法是只导入其中之一,另一个使用完整名称(包名.类名):

或者二者都不导入,只使用完整名称:

3.4. Creating a New Package

  包名和路径相关联,如有位于packagea的ClassA在C:\temp\packagea\ClassA.java,有packageb的ClassB在C:\temp\packageb\ClassB.java:

在Windows下进行编译和运行的方法如下:

packagea和packageb都位于temp文件夹下,进入temp文件夹后,可以直接使用javac进行编译。此外,还可以通过class path来指定其他路径下的文件:

也可以使用通配符来包含class path下的所有jar:

3.5. Code Formatting on the Exam

  如果考试中的问题不涉及import,则题目的代码中会省略import的部分,此时代码段的行号不会从1开始,下面的代码段从第6行开始,说明省略了import的部分:

  而对于下面的代码段,行号从1开始,而又没有import ArrayList,则认为该段代码无法编译: