库的创建者必须能自由地进行修改与改进,同时保证客户程序员代码不会受到那些变动的影响。
使用 JAR文件时要注意一个问题:
必须将JAR文件的名字置于类路径里,而不仅仅是它所在的路径。所以对一个名为grape.jar 的JAR文件来说,我们的类路径需要包括:
CLASSPATH=.;D:\JAVA \LIB;C:\flavors\grape.jar
import com.bruceeckel.util.*;
/**
* 编译器遇到 import语句后,它会搜索由CLASSPATH 指定的目录,
* 查找子目录com\bruceeckel\util,然后查找名称适当的已编译文件
* (对于Vector 是Vector.class,对于 List 则是List.class)。
* 注意Vector 和List 内无论类还是需要的方法都必须设为public。
*/
public class LibTest {
public static void main(String[] args) {
Vector v = new Vector();
List l = new List();
}
}
Java 访问指示符
不要错误地以为 Java 无论如何都会将当前目录作为搜索的起点看待。如果不将一个“.”作为 CLASSPATH 的一部分使用,Java 就不会考虑当前目录。
- 默认的friendly - 意味着当前包内的其他所有类都能访问“友好的”成员,但对包外的所有类来说,这些成员却是“私有”(Private)的,外界不得访问。 - “包访问”权限
- public:接口访问 - 意味着紧随在public 后面的成员声明适用于所有人,特别是适用于使用库的客户程序员。
- private :不能接触 - 意味着除非那个特定的类,而且从那个类的方法里,否则没有人能访问那个成员。
- protected:“友好的一种” -
创建一个新类:
将public成员置于最开头,后面跟随protected、有好以及private成员。
好处:使用者可以从上向下一次阅读,并首先看到对自己来说最重要的内容(public成员,因为它们可从文件的外部访问,并在遇到非公共成员后停止阅读,后者已经属于内部实施细节的一部分了)
// 为控制一个类的访问,指示符必须在关键字class 之前出现。所以我们能够使用:
public class Widget {
// 也就是说,假若我们的库名是mylib,那么所有客户程序员都能访问Widget——通过下述语句:
import mylib.Widget;
或者
import mylib.*;
注意到一些额外的限制:
- 每个编译单元(文件)都只能有一个public 类。每个编译单元有一个公共接口的概念是由那个公共类表达出来的。
- public类的名字必须与包含了编译单元的那个文件的名字完全相符,甚至包括它的大小写形式。
- 可能(但并常见)有一个编译单元根本没有任何公共类。此时,可按自己的意愿任意指定文件名。
对于类的访问只有两个选择:“友好的”或者public。若不愿其他任何人访问那个
类,可将所有构建器设为private。