20

可能重复:
为什么 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
{
    public static void main(String []args)
    {
        System.out.println("this is Main method");
    }
}
4

1 回答 1

26

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

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

JLS 指出:

当包存储在文件系统中时(第 7.2.1 节),如果在由类型名称加上如果以下任一情况为真,则为扩展名(例如 .java 或 .jav):

  • 该类型由声明该类型的包的其他编译单元中的代码引用。
  • 该类型被声明为公共的(因此可以从其他包中的代码中访问)。

这个限制意味着每个编译单元最多只能有一个这样的类型。这个限制使得 Java 编程语言的编译器或 Java 虚拟机的实现很容易在包中找到命名类;例如,公共类型wet.sprocket.Toad 的源代码可以在目录wet/sprocket 中的文件Toad.java 中找到,相应的目标代码可以在同一目录中的文件Toad.class 中找到。

这意味着,对于场景 1,因为您只有temp.javawith package private class demo,所以包的任何其他编译单元中的代码都不会引用它,因此它将毫无问题地编译。

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

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

于 2012-05-04T05:51:28.777 回答