为什么Java文件必须与其公共类同名?

时间:2012-05-04 04:33:17

标签: java

  

可能重复:
  Why filename in java should be same as class name?

我有一个名为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");
    }
}

1 个答案:

答案 0 :(得分:22)

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

这是编译器很好地满足JLS的情况。

The JLS states:

  

当软件包存储在文件系统(第7.2.1节)中时,如果在由以下文件组成的名称下的文件中找不到类型,则主机系统可以选择强制执行编译时错误的限制。如果满足以下任一条件,则输入类型名称加上扩展名(例如.java或.jav):

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

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

对于方案1,这意味着,因为您只有temp.java包私有类demo,所以它不会被包中的任何其他编译单元中的代码引用,因此它会毫无问题地编译。

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

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