为什么只有1个公共类在Java文件中

在任何Java文件中,为什么只能有一个名称与Java文件名相同的公共类?

它强制所有Java代码以某种方式进行组织 ,从长远来看,这有助于提高代码的可读性

Javadevise人员select了严格的方法来强化他们的良好devise实践的想法,这是这个主题的一部分。 与Perl中的随意态度相对比。

根据这个来源 ,这是为了高效编译:

在侧边栏中,它解释了为什么:“这个限制还没有被编译器强制执行,虽然有效的包导入是必要的”

这很明显 – 就像大多数事情一旦你知道devise原因一样 – 编译器将不得不通过所有的编译单元(.java文件)进行额外的传递,以找出哪些类是在哪里,这将使编译更慢。

这同样适用于在IDE中导入源文件。 另一个原因是合理的来源大小。

这些是规则。 虽然这不是真的。 你可以像这样在你的“main”类中定义内部类:

 public class A { public class B { ... } } 

礼貌Heinz Kabutz博士和他的优秀通讯 ….

为什么每个公共课都在一个单独的文件?

这是我在课程中经常被问到的一个问题。 到目前为止,我还没有很好的回答这个问题。 在第1节中,我们读到:“虽然每个Oak编译单元可以包含多个类或接口,但每个编译单元最多只能有一个类或接口。

在侧边栏中,它解释了为什么:“这个限制还没有被编译器强制执行,虽然有效的包导入是必要的”

这很明显 – 就像大多数事情一旦你知道devise原因一样 – 编译器将不得不通过所有的编译单元(.java文件)进行额外的传递,以找出哪些类是在哪里,这将使编译更慢。

Java利用这种约定,通过从类path开始并扫描子目录中的包层次结构来查找类/接口字节码。 这个层次结构的文件系统表示也强制执行一些基本规则。

  1. 同一个包中的任何两个Java类或接口不能具有相同的名称。 文件名称会冲突。
  2. 同一父包中的任何两个Java包不能具有相同的名称。 文件夹path会冲突。
  3. 一个类可以看到同一个包中的所有类,而不需要修改类path。

我们可以在任何java编译单元(.java源文件)中只有一个顶级公共类或接口。

但是每个src文件可以有任意数量的默认类/接口。

为什么:

JLS将选项留给java编译器。 而且大多数编译器实现都强制使文件名与以下内容相同:

(1)公共类/接口名称

(2)如果有一个主要的方法,没有公共类,那么任何名称

(3)如果有主要方法和公共类,那么主要方法应该在那个公共类中

(4)如果没有公共类和没有主要方法,那么任何有效的名字可能与文件中的类/接口名称匹配或不匹配。

从(2):如果允许两个公开课,我们应该给文件两个名字,这对文件系统是非常没有意义的。 从(3):如果允许两个公共类,我们应该有两个主要的方法,这对java来说是毫无意义的

因此,Java源文件只能有一个公共类。

我认为以上4点是编译器强制编译器和jvm的工作,以便于编译/加载/链接find特定的Java源文件或类文件。 Java有这样的限制,开发人员应该遵循这些限制来进行更好的编程。

来源:我的阅读和理解。

它可以在编译期间(导入指令)更有效地查找源代码( .java)和编译( .class)文件,并在执行过程中实现更高效的类加载。 这个想法是:如果你知道一个类的名字,你知道它应该在哪里find每个类path条目。 不需要索引。

我认为这可能是一个可能的原因。 java文件中只能有一个公共类,因为java文件的名称与公共类的名称相同。显然,我们不能使用两个不同名称的文件。

理解编译器和程序员之间的关系。源代码必须具有最多一个公共类,并且该类必须包含主函数。因此,编译器无需任何混淆/限制就可以访问(公共)类和将类名命名为类文件。由于此类包含main(),所以执行类文件将给出正确的stream