Java 允许使用包( package > 将类组织起来。借助于包可以方便地组织自己的代码,并将 自己的代码与别人提供的代码库分开管理。
使用包的主要原因是确保类名的唯一性。 假如两个程序员不约而同地建立了 Employee 类。 只要将这些类放置在不同的包中, 就不会产生冲突。事实上,为了保证包名的绝对 唯一性, Sun 公司建议将公司的因特网域名(这显然是独一无二的)以逆序的形式作为包 名,并且对于不同的项目使用不同的子包。 例如, horstmann.com 是本书作者之一注册的域 名。逆序形式为 com.horstmann。 这个包还可以被进一步地划分成子包, 如 com.horstmann. corejava。
从编译器的角度来看, 嵌套的包之间没有任何关系。 例如,java.utU 包与 java.util.jar 包 毫无关系。每一个都拥有独立的类集合。
1. 类的导入 从编译器的角度来看, 嵌套的包之间没有任何关系。 例如,java.utU 包与 java.util.jar 包 毫无关系。每一个都拥有独立的类集合。 但是, 需要注意的是, 只能使用星号(*) 导入一个包, 而不能使用 import java.* 或 import java.*.* 导入以 java 为前缀的所有包。 注意:C++ 程序员经常将 import 与 #include 弄混。 实际上, 这两者之间并没有共同 之处 。在 C++ 中, 必须使用 include 将外部特性的声明加栽进来, 这是因为 C++ 编译器 无法查看任何文件的内部, 除了正在编译的文件以及在头文件中明确包含的文件。Java 编译器可以查看其他文件的内部, 只要告诉它到哪里去查看就可以了 在 C-H■ 中, 与 包 机 制 类 似 的 是 命 名 空 间(namespace)。 在 Java 中, package 与 import 语句类似于 C+H■ 中的 namespace 和 using 指令。
2. 静态导入: import 语句不仅可以导人类,还增加了导人静态方法和静态域的功能。 例如,如果在源文件的顶部, 添加一条指令: import static java.lang.System.*; 就可以使用 System 类的静态方法和静态域,而不必加类名前缀: out.println("Goodbye, World!"); //i.e., System.out exit⑼; //i.e., System.exit 另外,还可以导入特定的方法或域: import static java.lang.System.out; 实际上,是否有更多的程序员采用 System.out 或 System.exit 的简写形式,似乎是一件值 得怀疑的事情。这种编写形式不利于代码的清晰度。不过, sqrt(pow(x, 2) + pow(y, 2)) 看起来比 Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) 清晰得多。
3. 将类放入包中 要想将一个类放人包中, 就必须将包的名字放在源文件的开头, 包中定义类的代码之 前。例如,程序清单 4-7 中的文件 Employee.java 开头是这样的: package co«.horstiann.corejava; public class Employee { } 如果没有在源文件中放置 package 语句, 这个源文件中的类就被放置在一个默认包 ( defaulf package ) 中。默认包是一个没有名字的包。在此之前,我们定义的所有类都在默认 包中。 将包中的文件放到与完整的包名匹配的子目录中。 例如, com.horstmann.corejava 包 中的所有源文件应该被放置在子目录 com/horstmann/corejava ( Windows 中 com\horstmann\ corejava) 中。编译器将类文件也放在相同的目录结构中。
4. Jar包 类文件也可以存储在 JAR(Java归档 )文件中。在一个 JAR 文件中, 可以包含 多个压缩形式的类文件和子目录, 这样既可以节省又可以改善性能。在程序中用到第三方 ( third-party ) 的库文件时,通常会给出一个或多个需要包含的 JAR 文件。JDK 也提供了许多 的 JAR 文件, 例如,在 jre/lib/rt.jar 中包含数千个类库文件。
为了使类能够被多个程序共享,需要做到下面几点: 1 ) 把类放到一个目录中, 例如 /home/user/classdir。需要注意, 这个目录是包树状结构 的基目录。 如果希望将 com.horstmann.corejava.Employee 类添加到其中,这个 Employee.class 类文件就必须位于子目录 /home/user/classdir/com/horstmann/corejava 中。 2 ) 将 JAR 文件放在一个目录中,例如:/home/user/archives。 3 ) 设置类路径(classpath)。类路径是所有包含类文件的路径的集合。
警告: javac 编译器总是在当前的目录中查找文件, 但 Java 虚拟机仅在类路径中有 目录的时候才查看当前目录如果没有设置类路径, 那也并不会产生什么问题, 默认的 类 路 径 包 含 目 录 . 然 而 如 果 设 置 了 类 路 径 却 忘 记 了 包 含 目 录, 则 程 序 仍 然 可 以通过编译, 但不能运行。