“进行面向对象的设计时,一项基本的考虑是:如何将发生变化的东西与保持不变的东西分隔开。”
为什么?
库的用户(client programmer):必须应该知道他可以使用那些类的成员和方法。
库的创建者:为了以后能对库自由地进行修改与改进,同时保证客户程序员代码不会受到那些变动的影响;因此他需要声明哪些东西是客户程序员可以使用的,哪些是不可使用的。把所有不想被用户使用的都声明为private.
5.1包(package):库单元
一、 import关键字:引入java源程序中用到的包或包里的成员,放在java源程序的开头
1、 引入包中所有的类
例:import java.util.*;-引入java/util包中所有的类。
2、 引入包里的一个类
例:import java.util.Vector;-引入java/util包中Vector类。
3、 目的:提供一种特殊的机制,以便管理一个对因特网友好的“命名空间”(Name Space)。即,类名全球唯一。
二、 编译单元:Java创建的一个源码文件。
1、 每个编译单元都必须有一个以.java结尾的名字。在编译单元的内部,可以有且只能有一个公共(public)类,它必须拥有与文件相同的名字(包括大小写形式,但排除.java文件扩展名);这个编译单元中剩下的类(如果有的话),对于这个编译单元包外面的世界是隐藏的,不可以访问的。
2、 编译一个.java文件时,对于.java文件中的每个类,都会得到一个.class文件。一个有效的程序就是一系列.class文件,它们可以封装和压缩到一个JAR文件里(使用Java 1.1提供的jar工具)。Java解释器负责对这些文件的寻找、装载和解释。
三、 包的定义:一个库中一堆.class文件。
1、 package关键字:指明编译单元所属的包
例:package mypackage;
package语句必须作为文件的第一个非注释语句出现。该语句的作用是指出这个编译单元属于名为mypackage的一个库的一部分。或者换句话说,它表明这个编译单元内的public类名位于mypackage这个名字的下面。如果其他人想使用这个类,要么指出完整的名字-包.类名,要么与使用import关键字。注意根据Java包(封装)的约定,包名字内的所有字母都应小写。
2、 库设计者,一定要记住package和import关键字允许我们做的事情就是分割单个全局命名空间,保证我们不会遇到名字的冲突
3、 java中的包没有管理机制,只要我们声明我们的类属于一个包,就可使用包中除private的类。
四、 CLASSPATH的陷阱
1、 Java解释器的工作程序如下:首先,它找到环境变量CLASSPATH。CLASSPATH包含了一个或多个目录,它们作为一种特殊的“根”使用,从这里展开对.class文件的搜索。从那个根开始,解释器会寻找包名,并将每个点号(句点)替换成一个斜杠,从而生成从CLASSPATH根开始的一个路径名。随后将它们连接到一起,成为CLASSPATH内的各个条目(入口)。以后搜索.class文件时,就可从这些地方开始查找与准备创建的类名对应的名字。此外,它也会搜索一些标准目录——这些目录与Java解释器驻留的地方有关。
2、 务必保证对于类路径的每个地方,每个名字都仅存在一个类。
3、 CLASSPATH就是类库所在的目录。
4、 当用多个.*引入多个包时,如果存在相同的类名,必须带上包名使用。
五、 包的两个额外的作用
1、 自定义工具库
不论什么对象,只要放入String表达式,他就会被强制转化为这个对象的String表达形式。
2、 利用导入改变行为
5.2 Java访问指示符:“友好的”,public,private,protected
Java访问指示符都置于数据成员和方法的最前面。
一、“友好的”:包中有效。
1、 不指定访问指示符,默认就是friendly.
2、 当前包内的其他所有类都能访问“友好的”成员和方法,但对包外的所有类来说,这些成员却是“私有”(Private)的,外界不得访问。
二、public:接口访问。
1、 在public后面的成员声明适用于所有人,
2、 默认包:处于同一个目录下的.class,没有定义package,这个目录就是这些.class的一个默认包。
三、private:不能接触!
1、 private关键字意味着除非那个特定的类,而且从那个类的方法里,否则没有人能访问那个成员。
四、protected:友好的+子类可以访问
5.3类访问
1、 每个编译单元(文件)都只能有一个public类。每个编译单元有一个公共接口的概念是由那个公共类表达出来的。根据自己的需要,它可拥有任意多个提供支撑的“友好”类。但若在一个编译单元里使用了多个public类,编译器就会向我们提示一条出错消息。
2、 public类的名字必须与包含了编译单元的那个文件的名字完全相符,甚至包括它的大小写形式。
3、 可能(但并常见)有一个编译单元根本没有任何公共类。此时,可按自己的意愿任意指定文件名。
4、 对于类的访问只有两个选择:“友好的”或者public。若不愿其他任何人访问那个类,可将所有构建器设为private。这样一来,在类的一个static成员内部,除自己之外的其他所有人都无法创建属于那个类的一个对象