繁体   English   中英

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

[英]Why does Java allow us to compile a class with a name different than the file name?

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

public class Abcd
{
        //some code here

}

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

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

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

基本原理是允许每个.java文件使用多个顶级类。

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

一旦Java引入了嵌套类,这条规则的重要性就会大大降低。 今天,您可以浏览数百个Java文件,而不会在利用它的文件上进行搜索。

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

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

Java规范声明每个文件最多只能有一个公共类。 在这种情况下,类名应与文件名匹配。 无论文件名是什么,都允许所有非公共类具有任何名称。

我认为允许它们是嵌套类的先决条件。 特别是匿名类可以显着减少所需的.java文件数量。 如果不支持这一点,你需要在他们自己使用的主类的独立文件中进行大量的单一方法接口实现。(我特别想到动作监听器)

Oracle网站上的嵌套类 Java教程中对所有嵌套类有一个很好的解释,其中包含每个嵌套类的示例。 它也有一个有用的原因,我将引用它:

为什么使用嵌套类?

使用嵌套类的令人信服的理由包括:

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

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

  • 它可以带来更易读和可维护的代码 :在顶级类中嵌套小类会使代码更接近于使用它的位置。

(强调我的)

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

我反过来看它。 自然状态是程序员独立选择类名和文件名。 可能为了简化在编译期间从包外部查找公共类,有一个特殊限制,即公共类位于具有相应名称的文件中。

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

或者假设您碰巧有一个名为ABCD的类,以及一个Abcd类(让我们不介意这是一个坏主意:它可能发生)并且该程序被移植到不区分大小写的文件系统。 现在你不仅要重命名文件,还要重命名类,oops!

或者如果没有文件怎么办? 假设您有一个Java编译器,可以对标准输入进行输入。 那么这个类必须命名为“StandardInput”?

如果你理性地探索要求文件名遵循类名的含义,你会发现它不止一种方式是一个坏主意。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM