为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。
包的作用:
把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
Java 使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等。
包语句的语法格式为:
|
|
一个包(package)可以定义为一组相互联系的类型(类、接口、枚举和注释),为这些类型提供访问保护和命名空间管理的功能。
以下是一些 Java 中的包:
java.lang
-打包基础的类java.io
-包含输入输出功能的函数
package
目录结构
类放在包中会有两种主要的结果:
- 包名成为类名的一部分,正如我们前面讨论的一样。
- 包名必须与相应的字节码所在的目录结构相吻合。
例如:有一个 com.runoob.test
的包,这个包包含一个叫做 Runoob.java
的源文件,那么相应的,应该有如下面的一连串子目录:
|
|
编译的时候,编译器为包中定义的每个类、接口等类型各创建一个不同的输出文件,输出文件的名字就是这个类型的名字,并加上 .class 作为扩展后缀。 例如:
|
|
现在,我们用-d选项来编译这个文件,如下:
|
|
这样会像下面这样放置编译了的文件:
|
|
编译之后的 .class 文件应该和 .java 源文件一样,它们放置的目录应该跟包的名字对应起来。但是,并不要求 .class 文件的路径跟相应的 .java 的路径一样。你可以分开来安排源码和类的目录。
|
|
这样,你可以将你的类目录分享给其他的编程人员,而不用透露自己的源码。用这种方法管理源码和类文件可以让编译器和 java 虚拟机(JVM)可以找到你程序中使用的所有类型。
类目录的绝对路径叫做 class path。设置在系统变量 CLASSPATH 中。编译器和 java 虚拟机通过将 package 名字加到 class path 后来构造 .class 文件的路径。
<path- two>\classes
是 class path,package 名字是 com.runoob.test
,而编译器和 JVM 会在 <path-two>\classes\com\runoob\test
中找 .class 文件。
一个 class path 可能会包含好几个路径,多路径应该用分隔符分开。默认情况下,编译器和 JVM 查找当前目录。JAR 文件按包含 Java 平台相关的类,所以他们的目录默认放在了 class path 中。
设置 CLASSPATH
用下面的命令显示当前的 CLASSPATH
变量:
Windows 平台(DOS 命令行下)
1
> set CLASSPATH
UNIX 平台(Bourne shell 下)
1
$ echo $CLASSPATH
删除当前 CLASSPATH
变量内容:
Windows 平台(DOS 命令行下)
1
> set CLASSPATH=
UNIX 平台(Bourne shell 下):
1
$ unset CLASSPATH; export CLASSPATH
设置 CLASSPATH
变量:
Windows 平台(DOS 命令行下):
1
> set CLASSPATH=C:\users\jack\java\classes
UNIX 平台(Bourne shell 下):
1
$ CLASSPATH=/home/jack/java/classes; export CLASSPATH