为什么Java允许我们编译一个名称不同于文件名的类?

我有一个文件Test.java和它下面的代码。

 public class Abcd { //some code here } 

现在类不编译,但是当我删除public修饰符,它编译好。

Java背后的原因是什么让我们能够编译一个不同于文件名的类名,而不是公开的。

我知道这是一个新手问题,但我无法find一个好的解释。

理由是每个.java文件允许多个顶级类。

许多类(如事件侦听器)只能在本地使用,最早的Java版本不支持嵌套类。 如果没有放宽“文件名=类名”规则,每一个这样的类都需要自己的文件,这种不可避免的结果是小的.java文件的不断扩散以及紧密耦合的代码的散布。

一旦Java引入了嵌套类,这个规则的重要性就大大减弱了。 今天,你可以浏览成百上千个Java文件,从来没有一个利用它的文件。

原因与门板相同。 如果有人正式在办公室(公布),他/她的名字必须在门牌上。 像“Alex Jones”或“Detective Colombo”。 如果有人刚刚走访房间,与官员谈话或清理地板,他们的名字就不必正式上门。 相反,门可以读“公用事业”或“会议室”。

官方名称或MyClass.java会议室或Test.java

Java规范规定,每个文件最多只能有一个公共类。 在这种情况下,类名称应与文件名称匹配。 无论文件名是什么,所有非公开课都可以有任何名字。

我认为允许他们是嵌套类的先决条件。 特别是匿名类大大减less了所需的.java文件的数量。 如果没有这个支持,你将需要在他们自己的独立文件中使用大量的单一方法接口实现。(我正在考虑动作监听器)

Oracle网站上的嵌套类 Java教程中的所有嵌套类都有很好的解释,每个类都有例子。 它也有一个有用的原因,我会引用:

为什么使用嵌套类?

使用嵌套类的强有力的理由包括:

  • 这是一种逻辑上将类只用于一个地方的方法 :如果一个类只对另一个类有用,那么将其embedded到该类中并将它们保持在一起是合乎逻辑的。 嵌套这样的“帮助类”使得它们的包更加简化。

  • 它增加封装 :考虑两个顶级类,A和B,其中B需要访问A的成员,否则将被宣布为私有。 通过在类A中隐藏类B,可以将A的成员声明为私有,并且B可以访问它们。 另外,B本身可以被外界隐藏起来。

  • 它可以导致更易于读取和维护的代码 :在顶层类中嵌套小类可以使代码更接近它的使用位置。

(重点是我的)

在早期我不太熟悉Java规范,但是快速search显示Java 1.1中添加了内部类。

我反过来看。 事务的自然状态是程序员可以独立select类名和文件名。 可能为了简化在编译过程中从包外部find公共类,公共类在具有相应名称的文件中存在特殊限制。

请注意,Java是区分大小写的,但文件系统不一定是。 如果文件的基本名称是“abcd”,但类是“Abcd”,那么它是否符合不区分大小写的文件系统的规则? 当然不是移植到区分大小写的时候。

或者假设你碰巧有一个名为ABCD的类,还有一个Abcd类(我们不要说这是一个坏主意:它可能发生),程序将移植到不区分大小写的文件系统。 现在你不仅需要重命名文件,而且还需要类,哎呀!

或者如果没有文件呢? 假设你有一个可以在标准input上input的Java编译器。 那么这个类必须被命名为“StandardInput”?

如果你理性地探索需要文件名跟随类名的含义,你会发现这是一个坏主意,在多个方面。

还有一点,许多答案错过了指出,没有public声明,JVM永远不会知道哪些类的主要方法需要被调用。 在一个.java文件中声明的所有类都可以有主要方法,但主要方法只在标记为public的类上运行。 HTH

由于一个java文件可以包含多个类,所以在一个java文件中可能有两个类。 但是,如果一个java文件包含一个公共类,则它必须包含一个与文件名相同的类。