为什么我不能使用包私有(隐式)class 作为 java 文件的顶级 class?

Why cannot I use a package-private (implicit) class as the top-level class of a java file?

我是 Java 的新手。可能问题有点幼稚

比如我有一个pkg1,里面有2个Java个文件:f1.java和f2.java

如题,我觉得很有道理 为 f1 使用 package-private-top-level class, 然后对 f2 使用 public-top-level class, 那么 pkg1 的外部仍然可以通过 f2 访问 f1。

我什至可以有 f3,f4……,它们都使用 package-private class 作为它们的顶级 class。然后 f2.java 将成为 pkg1 中其余文件的包接口文件。

那么,为什么顶级 class 必须是 public?只是为了避免不必要的复杂性?

why is the fact that a top-level class must be public?

A "top level" class in Java 只是一个 class 而不是嵌套的 class (一个 class 在另一个里面class — JLS§8)。他们不需要 public.

您可能会想到通过 java 工具 运行 的应用程序(并非所有应用程序都是!)。 class 旨在用作 java 工具的入口点,在示例中通常显示为 public,但 不是 必需的成为。它 需要一个 public static void main 方法接受一个 String 数组,但是 class 本身没有成为 public.

根据 Oracle Java tutorialpublic 不是顶级 class 的唯一可能修饰符:

A class may be declared with the modifier public, in which case that class is visible to all classes everywhere. If a class has no modifier (the default, also known as package-private), it is visible only within its own package

因此,基本上,如果您的设计要求,使某些 classes 受保护或包私有是没有问题的。

术语'top-level class'实际上存在于Java以及术语'inner class'和'nested class',建议您查看this page以清除java class 层次结构的一些基础知识。

顶级 class 应该是 public 因为 public class 可以在 java 宇宙的任何地方使用,但是如果你声明class private 或 protected 那么它的唯一目的就失去了声明 class private 将不允许这个 class 对任何其他 class 可见并且标记它是受保护的也会做同样的事情 thing.Its 始终建议将 class 设置为默认值或 public.