在Java中,没有管理名称空间的办法,你可能觉得不方便,因为每个单独的类都有描述性的名称。你还需要有确保你选用的类名是独特的且不和其他程序员选择的类名相冲突的方法(假想一小组程序员为用“Foobar”作类名而争斗。或者,设想整个Internet团体为谁最先为类取名为“Espresso”而争论)。
感谢上帝,Java提供了把类名空间划分为更多易管理的块的机制。这种机制就是包。包既是命名机制也是可见度控制机制。你可以在包内定义类,而且在包外的代码不能访问该类。这使你的类相互之间有隐私,但不被其他世界所知。
定义包
创建一个包是很简单的:只要包含一个package命令作为一个Java源文件的第一句就可以了。该文件中定义的任何类将属于指定的包。package语句定义了一个存储类的名字空间。
如果你省略package 语句,类名被输入一个默认的没有名称的包(这是为什么在以前你不用担心包的问题的原因)。尽管默认包对于短的例子程序很好用,但对于实际的应用程序它是不适当的。多数情况,需要为自己的代码定义一个包。
下面是package 声明的通用形式:
package pkg;
这里pkg 是包名。例如,下面的声明创建了一个名为MyPackage的包。
package MyPackage;
Java用文件系统目录来存储包。例如,任何你声明的MyPackage中的一部分的类的.class文件被存储在一个MyPackage 目录中。记住这种情况是很重要的,目录名必须和包名严格匹配。
多个文件可以包含相同package声明。package声明仅仅指定了文件中定义的文件属于哪一个包。它不拒绝其他文件的其他方法成为相同包的一部分。多数实际的包伸展到很多文件。
你可以创建包层次。为做到这点,只要将每个包名与它的上层包名用点号“.”分隔开就可以了。一个多级包的声明的通用形式如下:
package pkg1[.pkg2[.pkg3]];
包层次一定要在Java开发系统的文件系统中有所反映。例如,一个由下面语句定义的包:
package java.awt.image;
需要在你的UNIX、Windows或Macintosh文件系统的 java/awt/image, java\awt\image或java:awt:image中分别保存。一定要仔细选用包名。你不能在没有对保存类的目录重命名的情况下重命名一个包。