省略java中的访问说明符

时间:2014-01-20 10:39:12

标签: java class access-specifier

我知道在java文件中声明的public类的名称必须与其文件名相同。但我想知道这是不是给我一个编译错误,而是它成功运行。

class Foo //<-- this can be any name...
{
    public static void main(String[] args)
    {
        System.out.println("Hello World!");
    }
}

我知道默认访问权限为package private。对于上述程序,类名和文件名不必相同。它正在执行,而不是编译器错误。 任何人都可以投光吗?谢谢。

修改

现在我明白了!但另一个问题让我感到震惊。当同一个文件中有两个这样的类时会发生什么?

好吧,我认为将在已实现.class方法的类中生成main文件。没有任何编译错误,但令我惊讶的是,也没有生成任何.class文件。为什么会这样?

2 个答案:

答案 0 :(得分:1)

你的观察是正确的。如果类不是公共的,则类的名称不需要与文件名匹配。如果文件中没有公共类,则可以根据需要为文件命名。

如果你说有一个源文件Test003.java并且你在其中定义了 两个非公开类AAA和BBB,没有编译
生成错误和两个类文件:AAA.classBBB.class

所以一切都很好。

01/20/2014  06:27 AM               238 AAA.class
01/20/2014  06:27 AM               238 BBB.class

enter image description here

答案 1 :(得分:1)

是的,这绝对没问题。即使对于公共类,这也是特定于编译器的可选限制。

来自section 7.6 of the JLS

  

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

     
      
  • 该类型由声明类型的包的其他编译单元中的代码引用。

  •   
  • 该类型声明为public(因此可以从其他包中的代码访问)。

  •   

请注意第二个要点 - 当您的班级不公开时,此限制不适用。

编辑:从更新的问题......

  

当同一个文件中有两个这样的类时会发生什么?

基于类名生成类文件。 main方法的存在与完全无关,原始源文件名也是如此。如果编译成功,则必须生成 类文件。如果没有示例代码来重现问题,我们无法确定真正发生的事情。