为什么Java文件必须与其公共类具有相同的名称?

为什么Java文件必须与其公共类具有相同的名称?,java,Java,可能重复: 我有一个名为temp.java的文件。我编写了以下代码。为什么这样做有效 class demo //not public keyword and not same as filename { public static void main(String []args) { System.out.println("this is Main method"); } } 任何人都知道为什么这不起作用 public class demo {

可能重复:

我有一个名为
temp.java
的文件。我编写了以下代码。为什么这样做有效

class demo //not public keyword and not same as filename
{
    public static void main(String []args)
    {
        System.out.println("this is Main method");
    }
}
任何人都知道为什么这不起作用

public class demo
{
    public static void main(String []args)
    {
        System.out.println("this is Main method");
    }
}

在第一个示例中,类实际上被声明为“包私有”(无修饰符),这意味着只有同一个包中的类才能访问它。在第二个示例中,您已将其声明为public

这是一个编译器很好地满足JLS的场景

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

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

这意味着,对于场景1,由于您只有包私有类
demo
temp.java
,因此包的任何其他编译单元中的代码都不会引用它,因此它将编译而不会出现问题

您的第二个场景已经声明了类public——这意味着它可能可以从其他包中的代码访问——因此它必须符合类名等于文件名的标准


如果您在第一个场景中创建了另一个类(在同一个包中),然后尝试引用该类
demo
,您应该会得到一个编译错误。

,因为这是法律!请看下面的链接,这个问题是如何被标记为重复的,没有指向dup的链接?这是2012年遗留下来的魔法吗?这是语言中的一条规则。其他语言(例如Xtend)没有这样的限制。我想用一种简单的语言回答,如果一个类在其他编译单元中引用(包外的文件,包内的文件),那么编译器会做两件事:1)在类路径中搜索该类,但是程序的职责是告诉类路径中该类存在的位置。2) 它在当前类路径中搜索与类名匹配的文件名,当它获得所需的文件时,然后在文件中搜索类名。如果在任何选项中,一切都正常,那么编译也正常。