访问权限控制

访问权限的控制常被称为是具体实现的隐藏。把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是封装。其结果是一个同时带有特征和行为的数据类型。

包:库单元

当编写一个 Java 源代码时,此文件通常被称为编译单元(也称转译单元)。每个编译单元的后缀名必须是 .java,在编译单元内,只能有一个 public 类,并且类名必须与文件名相同。在编译单元内的其他类,主要用来服务 public 类。

当编译一个 .java 文件时,在 .java 文件中的每个类都会有一个输出文件,该输出文件的名称与类的名称相同,后缀名为 .class

Java 可运行程序是一组可以打包并压缩为一个 Java 文档文件(JAR,使用 Java 的 jar 文档生成器)的 .class 文件。Java 解释器负责这些文件的查找、装载和解释。

通过 package 来声明文件所在的包,按照惯例,package 名称的第一部分是类创建者的反顺序的 Internet 域名:

1
2
3
package net.mindview.simple;  // 域名为 mindview.net

// 子目录为 net\mindview\simple

文件处于相同目录下,但是没有声明包名时,默认隶属于该目录下的默认包之中。

private

private 可以阻止别人直接访问构造器,另外,当默认构造器是唯一定义的构造器,并且是 private 时,可以阻碍对此类的继承。

1
2
3
4
5
6
7
8
9
10
11
12
class 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
18
class 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 的,所以只能通过 publicgetP() 访问。