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

时间:2013-11-25 14:38:26

标签: java

我有一个文件Test.java,里面有以下代码。

public class Abcd
{
        //some code here

}

现在该类没有编译,但是当我删除public修饰符时,它编译得很好。

Java背后的原因是什么允许我们在不公开时编译与文件名不同的类名。

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

8 个答案:

答案 0 :(得分:323)

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

许多类(如事件侦听器)仅供本地使用,最早的Java版本不支持嵌套类。如果没有“filename = class name”规则的放宽,每个这样的类都需要自己的文件,不可避免的结果是小.java文件无休止地扩散,并且散布紧密耦合的代码。

一旦Java引入了嵌套类,这条规则的重要性就会大大降低。今天你可以浏览数以百计的Java文件,而不会利用它来利用它。

答案 1 :(得分:79)

原因与门板相同。如果某人正式居住在办公室(公开宣布),他/她的名字必须在门牌上。像“亚历克斯琼斯”或“侦探科伦坡”。如果有人只是去房间,与官员交谈或清理地板,他们的名字不一定要正式上门。相反,门可以读作“公用事业”或“会议室”。

Official name or MyClass.java Meeting room or Test.java

答案 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文件包含公共类,则必须包含与文件名相同的类。