访问权限的控制常被称为是具体实现的隐藏。把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是封装。其结果是一个同时带有特征和行为的数据类型。
包:库单元
当编写一个 Java 源代码时,此文件通常被称为编译单元(也称转译单元)。每个编译单元的后缀名必须是 .java,在编译单元内,只能有一个 public 类,并且类名必须与文件名相同。在编译单元内的其他类,主要用来服务 public 类。
当编译一个 .java 文件时,在 .java 文件中的每个类都会有一个输出文件,该输出文件的名称与类的名称相同,后缀名为 .class。
Java 可运行程序是一组可以打包并压缩为一个 Java 文档文件(JAR,使用 Java 的 jar 文档生成器)的 .class 文件。Java 解释器负责这些文件的查找、装载和解释。
通过 package 来声明文件所在的包,按照惯例,package 名称的第一部分是类创建者的反顺序的 Internet 域名:1
2
3package net.mindview.simple; // 域名为 mindview.net
// 子目录为 net\mindview\simple
文件处于相同目录下,但是没有声明包名时,默认隶属于该目录下的默认包之中。
private
private 可以阻止别人直接访问构造器,另外,当默认构造器是唯一定义的构造器,并且是 private 时,可以阻碍对此类的继承。1
2
3
4
5
6
7
8
9
10
11
12class P {
private P() {
}
static P makeP() {
return new P();
}
}
// P p = new P(); 无法创建
P p = P.makeP();
类访问权限
对于类的访问权限,仅有两个选择:包访问权限,或 public。如果不希望其他任何人对该类拥有访问权限,可以把所有的构造器都指定为 private,从而阻止任何人创建该类的对象。但是有一个例外,就是在该类的 static 成员内部可以创建:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18class P {
private P() {
System.out.print("P: ");
}
private static P a = new P();
public static P getP() {
return a;
}
void print() {
System.out.println("a");
}
}
P.getP().print(); // P: a
以上这种特定的模式被称为 单例(singleton),因为始终只能创建它的一个对象。这个对象是 private 的,所以只能通过 public 的 getP() 访问。