本节内容介绍包的使用,主要是 package 语句。
1)随着代码的大量增加,程序员写的.java 源文件以及编译产生的.class 字节码文件会大量的增加。如果任由这种情况发生的话,无论是查询还是管理都会非常的不方便。为了解决这方面的问题,Java 提供了“包”来帮助我们组织和管理类。
在操作系统中,如果有大量的文件,为了方便管理,我们往往会按照某种规则,创建结构合理的文件夹结构。例如,如果有大量的 文件,用户可以把这些文件按照excel、 word、ppt等,创建相应的文件夹,分门别类的进行管理。 类似的,在 Java 中,为了更好的管理大量的类,引入了“包”的概念。 使用 package 语句可以用来将一个特定的类放入包中。要注意的是,如果要使用 package 语句,则这个语句必须作为.java 文件的第一个语句,并写在任何类的外面。例如,对我们之前写的 HelloWorld 类放入 learn.java 包,则代码如下:
package learn.java;
public class HelloWorld{
public static void main(String args[]){
System.out.print("Hello World");
}
}
上面的这段代码,就把 HelloWorld 类放在了 learn.java包下。要注意的是,在加包之后,使用java命令去运行 HelloWorld 类时必须加上包名作为前缀,因此完整的写法应当是: learn.java.HelloWorld。这种在类名前面加上包名的写法称为类的全限定名。
首先我们使用编译命令编译HelloWorld.java文件。编译完成后生成HelloWorld.class文件。之后直接运行.class文件,会产生一个错误:
出现这个错误的原因显然跟我们刚刚给 HelloWorld 加包有关。 在加包之后,使用 HelloWorld 类时,必须使用全限定名运行 HelloWorld 的 class 文件。 即,命令必须是 java learn.java.HelloWorld 但是这样运行,依然会提示错误:
这个错误的原因在于,包结构必须和硬盘上的文件夹结构一致。也就是说,在上述例子中,HelloWorld.class 文件,必须放在类路径下的 learn/ java/目录 下。
在存放HelloWorld.java文件夹下,建立对应的包名目录结构,并将.class文件移动到特定文件夹下,在我的文件目录中,我需要在D:\core java\test文件夹下再新建对应的包的目录结构,即D:\core java\test\learn\java 。此时我的HelloWorld.class的存放地址为D:\core java\test\learn\java\HelloWorld.class
此时运行java learn.java.HelloWorld命令才能正确执行,结果如下:
使用包的主要目的是为了避免类名冲突。例如,假设有两个程序员不约而同的都使用 HelloWorld 作为类名。如果这两个类都不使用包的话,一方面,两个类的类名相同,因此在 使用上会产生歧义。另一方面,在把两个程序员写完的.class 字节码文件放在一起运行的时 候,在同一个文件夹下会有两个同名的字节码文件,从而产生文件冲突。而如果这两个程序 员使用不同的包 p1 和 p2,一方面生成的 HelloWorld.class 字节码文件一个放在 p1 目录下, 另一个放在 p2 目录下,不会有文件名的冲突。另一方面,全限定名不同,在使用这两个类 时,一个被称为 p1.HelloWorld,另一个被称为 p2.HelloWorld,从而避免了类名的冲突。