第六章 访问控制权限
6.1 包:库单元
默认包(未命名包):.java文件(编译单元/转译单元)直接位于src目录下。
6.1.1 代码组织
类库 -> 包 -> 编译单元(包含一个public类和任意个非public类)
package语句是.java文件的第一句非注释语句,它指明了该.java文件位于那一个包下。
.java文件的文件名必须与public类的类名相同(大小写敏感)。
若想在其他包的.java文件中使用该类,则需使用import语句导入相应的.java文件。
import packagename.ClassName;
6.1.2 创建独一无二的包名
包名一般是个人域名的反写。
在.java文件被编译成.class文件后,当java程序需要加载运行这些.class文件时,首先要确定.class文件的所在位置。
.class文件的所在位置由两部分来决定,一部分是CLASSPATH(类路径),另一部分是包名。CLASSPATH包含一个或多个目录,用于查找.class文件的根目录。从根目录开始,解释器根据包名,将每个句点替换成路径分隔符(不同的操作系统,路径分隔符也不同,windows系统是”\”,Linux是”/”),所得的路径与CLASSPATH中的每一个路径相连,然后再在每一个所得路径下查找需要的.class文件。
CLASSPATH中不仅有路径,还可能有jar包,只是jar包除了指明所在地目录外,还需要指明jar包名称。
import语句中出现*,表示导入相应包下的所有文件,这种方式容易引起冲突,不建议经常使用。
6.1.3 定制工具库
6.1.4 用import改变行为
条件编译:使程序员不必更换程序代码,就能够切换开关并产生不同行为,例如C语言中就具有该特性,这是因为C不具备跨平台特性,使用条件编译可以解决跨平台问题,而Java本身就是跨平台语言,所以无需条件编译的功能。
6.1.5 对使用包的忠告
6.2 Java访问权限修饰词
针对域(成员变量)和方法,Java有接口访问权限(public)、包访问权限、继承访问权限(protected)和无访问权限(private)。
6.2.1 包访问权限
这一访问权限没有修饰词,是默认的访问权限。这一访问权限意味着当前包下的其他类都能对那个类的成语变量和方法进行访问(假设成员变量和成员方法的访问权限都是默认权限)。
6.2.2 public:接口访问权限
public意味着如果其成员变量和成员方法都声明为public,项目下的其他所有类都能访问该类的成员变量和成员方法。
6.2.3 private:你无法访问
只有该类内部的成员变量和成员方法能互相访问,外部不能访问。建议将类的所有成员变量设置为private。
6.2.4 protected:继承访问权限
只有该类和由该类衍生出来的子类可以访问。
6.3 接口和实现
访问权限的控制常被称为具体实现的隐藏。
封装:把数据和方法包装进类中,以及具体实现的隐藏,常共同被称为封装。其所得为一个同时带有特征和行为的数据类型。
为了便于客户端程序员调用,常常按照public、protected、包访问控制权限和private的顺序,定义成员变量和成员方法,便于客户端程序员的阅读和调用。
6.4 类的访问权限
针对类(内部类除外),只有两种访问权限:public和默认访问权限。
单例模式(singleton)
class Soup2 {
private static Soup2 ps1 = new Soup2();
private Soup2(){
}
public static Soup2 access() {
return ps1;
}
}
只能通过access()方法创建对象,而无法通过new的方式创建对象。