访问权限的控制常被称为是具体实现的隐藏。把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是封装。其结果是一个同时带有特征和行为的数据类型。
包:库单元
当编写一个 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()
访问。