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