ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### [默认包](https://lingcoder.gitee.io/onjava8/#/book/07-Implementation-Hiding?id=%e9%bb%98%e8%ae%a4%e5%8c%85) 你可能惊讶地发现,以下代码尽管看上去破坏了规则,但是仍然可以编译: ~~~ // hiding/Cake.java // Accesses a class in a separate compilation unit class Cake { public static void main(String[] args) { Pie x = new Pie(); x.f(); } } ~~~ 输出: ~~~ Pie.f() ~~~ 同一目录下的第二个文件: ~~~ // hiding/Pie.java // The other class class Pie { void f() { System.out.println("Pie.f()"); } } ~~~ 最初看上去这两个文件毫不相关,但在**Cake**中可以创建一个**Pie**对象并调用它的`f()`方法。(注意,你的 CLASSPATH 中一定得有**.\*\*,这样文件才能编译)通常会认为 \*\*Pie**和`f()`具有包访问权限,因此不能被**Cake**访问。它们的确具有包访问权限,这是部分正确。**Cake.java**可以访问它们是因为它们在相同的目录中且没有给自己设定明确的包名。Java 把这样的文件看作是隶属于该目录的默认包中,因此它们为该目录中所有的其他文件都提供了包访问权限。