你会惊异地发现下面的程序代码虽然看起来是破坏了上述规则,但它仍可以进行编译。
//:c05:Cake.java
// Accesses aclass in a separate compilation unit.
importcom.bruceeckel.simpletest.*;
class Cake {
static Test monitor = new Test();
public staticvoid main(String[]args) {
Pie x = new Pie();
x.f();
monitor.expect(new String[] {
"Pie.f()"
});
}
} ///:~
在第二个处于相同目录的文件中:
//:c05:Pie.java
// The otherclass.
class Pie {
void f() {System.out.println("Pie.f()"); }
} ///:~
最初你或许会认为这两个文件毫不相关,但 Cake 却可以创建一个 Pie 对象并调用它的 f( )
方法!(记住,为了使文件可以被编译,在你的 CLASSPATH 之中一定要有‘.’。)你通常
会认为 Pie 和 f( )享有包访问权限,因而是不可以为 Cake 所用的。它们的确享有包访问
权限,但这只是部分正确的。Cake.java 可以访问它们的原因是因为它们同处于一个相同
的目录并且没有给自己设定任何包名称。Java 将这样的文件自动看作是隶属于该目录的缺
省包之中,于是它们为该目录中所有其他的文件都提供了包访问权限。
![](http://www.jiangyea.com/boke/00.jpg)