我有一个文件 Test.java和以下代码在它里面。
Test.java
public class Abcd { //some code here }
现在这个类不能编译,但是当我删除 public修饰符时,它能很好地编译。
public
Java 允许我们编译一个不同于非公共文件名的类名背后的原因是什么。
我知道这是一个新手的问题,但我找不到一个好的解释。
我从另一个角度来看。对于程序员来说,自然状态是独立地选择类名和文件名。可能是为了简化在编译期间从包外部查找公共类的过程,有一个特殊的限制,即公共类必须位于具有相应名称的文件中。
其基本原理是允许每个 .java文件有多个顶级类。
.java
许多类(例如事件侦听器)只能在本地使用,Java 的最早版本不支持嵌套类。如果没有对“ filename = class name”规则的这种放松,每个这样的类都将需要自己的文件,不可避免地会导致小 .java文件无休止的增殖和紧密耦合代码的分散。
一旦 Java 引入了嵌套类,这个规则的重要性就显著降低了。今天,您可以浏览数百个 Java 文件,但是从来没有碰巧遇到一个利用它的文件。
Java 规范规定,每个文件最多只能有一个公共类。在这种情况下,类名应该与文件名相匹配。所有非公共类都允许有任何名称,与文件名无关。
我认为允许它们是嵌套类的先决条件。匿名类特别显著地减少了。需要 java 文件。如果不支持这一点,您将需要在它们自己的独立文件中实现许多单一的方法接口实现,这些文件与它们所使用的主类不同。(我特别想到的是动作听众)
Oracle 网站上的 嵌套类 Java 教程中有关于所有嵌套类的详细说明,其中包含每个类的示例。它们之所以有用还有一个原因,我引用一下:
为什么使用嵌套类? 使用嵌套类的令人信服的理由包括: 这是一种逻辑分组只在一个地方使用的类的方法 : 如果一个类只对另一个类有用,那么将它嵌入到该类中并将两个类保持在一起是合乎逻辑的。嵌套这样的“助手类”可以使它们的包更加流线型。 它增加了封装 : 考虑两个顶级类 A 和 B,其中 B 需要访问 A 的成员,否则它们会是 通过在类 A 中隐藏类 B,A 的成员可以是 声明为私有,B 可以访问它们。此外,B 本身可以 隐藏在外面的世界 它可以产生更具可读性和可维护性的代码 : 在顶级类中嵌套小类会使代码更接近于它所在的位置 使用
使用嵌套类的令人信服的理由包括:
这是一种逻辑分组只在一个地方使用的类的方法 : 如果一个类只对另一个类有用,那么将它嵌入到该类中并将两个类保持在一起是合乎逻辑的。嵌套这样的“助手类”可以使它们的包更加流线型。
它增加了封装 : 考虑两个顶级类 A 和 B,其中 B 需要访问 A 的成员,否则它们会是 通过在类 A 中隐藏类 B,A 的成员可以是 声明为私有,B 可以访问它们。此外,B 本身可以 隐藏在外面的世界
它可以产生更具可读性和可维护性的代码 : 在顶级类中嵌套小类会使代码更接近于它所在的位置 使用
(强调我的)
我在早期并不熟悉 Java 规范,但是快速搜索显示 Java 1.1中添加了内部类。
注意,Java 是区分大小写的,但是文件系统不需要区分大小写。如果文件的基名是“ Abcd”,但类是“ Abcd”,这是否符合不区分大小写的文件系统上的规则?当然不是移植到一个大小写敏感的。
或者假设您碰巧有一个名为 ABCD 的类和一个名为 ABCD 的类(这不是一个坏主意: 它可能会发生) ,并且程序被移植到一个不区分大小写的文件系统。现在您不仅需要重命名文件,还需要重命名类,哎呀!
如果没有文件呢?假设您有一个 Java 编译器,它可以接受标准输入的输入。那么这个类必须命名为“ StandardInput”?
如果您理性地探索要求文件名跟随类名的含义,您会发现这在很多方面都是一个坏主意。
还有一点很多答案都没有指出,那就是如果没有 public声明,JVM 将永远不会知道需要调用哪些类的 main 方法。在一个中声明的所有类。Java 文件都可以有 main 方法,但 main 方法只能在标记为 public 的类上运行。高温
原因和车门板是一样的。如果某人正式居住在办公室(公开) ,他/她的名字必须在门牌上。比如“亚历克斯 · 琼斯”或者“科伦坡警探”。如果有人只是来访问房间,与官员交谈或清洁地板,他们的名字不必正式放在门上。相反,门上可以写着“公共设施”或“会议室”。
因为一个 java 文件可以包含多个类,所以它可以在一个 java 文件中包含两个类。但是如果 Java 文件包含一个公共类,那么它必须包含一个与文件名相同的类。