Java 源文件可以';I don’我没有一个以上的公共课

Java 源文件可以';I don’我没有一个以上的公共课,java,Java,我们只能在源文件中声明一个公共文件,并且文件名必须与公共类名匹配 这项限制有什么理由吗 在Java中,这不是强制性的限制。这是Java语言规范提到的一个选项。发件人: 当包存储在文件系统(§7.2.1)中时,如果在由类型名加扩展名(如.java或.jav)组成的文件名下未找到类型,则主机系统可以选择强制执行以下限制,即这是编译时错误,如果满足以下任一条件: 该类型由声明该类型的包的其他编译单元中的代码引用 该类型被声明为public(因此可以从其他包中的代码访问) 此限制意味着每个编译单元最

我们只能在源文件中声明一个公共文件,并且文件名必须与公共类名匹配

这项限制有什么理由吗

在Java中,这不是强制性的限制。这是Java语言规范提到的一个选项。发件人:

当包存储在文件系统(§7.2.1)中时,如果在由类型名加扩展名(如.java或.jav)组成的文件名下未找到类型,则主机系统可以选择强制执行以下限制,即这是编译时错误,如果满足以下任一条件:

  • 该类型由声明该类型的包的其他编译单元中的代码引用
  • 该类型被声明为public(因此可以从其他包中的代码访问)
此限制意味着每个编译单元最多必须有一个这样的类型。这种限制使得Java编程语言的编译器或Java虚拟机的实现很容易在包中找到命名类;例如,公共类型wet.sprocket.Toad的源代码可以在目录wet/sprocket中的文件Toad.java中找到,相应的目标代码可以在同一目录中的文件Toad.class中找到


但基本上,它是为了鼓励您使您的源代码更易于导航。如果您知道公共类的名称,通常很容易找到它的源代码。

是的,这是Java语言的规范…

原因是,这是惯例。类加载器还需要特定文件中的类。您可以编写自己的类加载器来避免这种限制,但没有充分的理由这样做。查看代码的每个人都会感到困惑。;)


但是,您可以通过创建内部类在一个文件中创建“多个”类。我知道,这不一样,但通常你应该考虑比为什么一个文件中只有一个类更重要的事情。

它在那里,这样编译器就可以找到依赖类的源代码。

@saravanan。我执行了一些简单的程序,这些程序显示,当您使用默认类名保存文件名时,只有一个默认类(即没有访问说明符的类)具有main方法在java中工作良好

为了补充使用公共类名命名文件的原因,我在一个文档中详细介绍了JVM查找公共类(因为没有限制,可以从任何地方访问)以及在公共类中查找公共静态void main()的情况

这个公共类充当java应用程序(程序)的JVM实例开始的初始类。因此,当您在程序中提供多个公共类时,编译器本身会抛出一个错误来阻止您

这是因为稍后您不能混淆JVM的初始类是哪个类,因为只有一个带有
publicstaticvoidmain(stringargs[])
的公共类是JVM的初始类


希望我能帮助您更好地理解JAVA编程命名。

请记住,只有类是public的,其中包含其他主要文件。不要是public的

这是一个可选限制,但是(AFAIK)所有主流JAVA实现(编译器、JVM、IDE等)强制执行。好的,我明白这条规则是为了让约定可以轻松地导航源文件和类。但是为什么我不能有多个公共文件,为什么同一约定不适用于非公共类(默认为同一个包)@user587072:你说的“为什么我不能有多个公共文件”是什么意思?文件不是公共的,类是公共的。如果你有不止一个公共类,它们不能都有相关的名称——所以至少有一个很难找到。至于为什么它不适用于非公共类:大概问题是,开发人员更希望找到公共类的源代码,而不是非公共类的源代码。但老实说,我只是在猜测。我认为该约定在可能的情况下适用于所有类。@Jon Skeet:至于为什么它不适用于非公共类……我认为开发人员不使用其他人提供的相同包,所以他们不需要知道非公共(包访问)类这一迷人的事实。我甚至不知道JLS以这种方式指定了可选特性,并且它将应用于这样一个基本的java限制。太糟糕了,我只能给+1(我个人认为这个限制在当今时代不再有用了..IDE在搜索类/方法/任何东西时不关心文件名,它会导致一些丑陋的5行类文件),这不仅仅是一个惯例。这是JLS中明确规定的可选限制。