在java中省略访问说明符

在java中省略访问说明符,java,class,access-specifier,Java,Class,Access Specifier,我知道java文件中声明的public类的名称必须与其文件名相同。但我想知道,这不是给我一个编译错误,而是它成功运行了 class Foo //<-- this can be any name... { public static void main(String[] args) { System.out.println("Hello World!"); } } class Foo/你的观察是正确的。如果该类不是公共的,则该类的名称不需要与文件名匹

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

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

class Foo/你的观察是正确的。如果该类不是公共的,则该类的名称不需要与文件名匹配。当文件中没有公共类时,可以随意命名文件

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

所以一切都很好。

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

是的,那很好。即使对于公共类,这也是编译器特定的可选限制

发件人:

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

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

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

请注意第二点-如果您的类不是公共的,则此限制不适用

编辑:从更新的问题

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


类文件是基于类名生成的。
main
方法的存在与此完全无关,原始源文件名也是如此。如果编译成功,肯定会生成一个类文件。如果没有重现问题的示例代码,我们无法判断到底发生了什么。

在一个java文件中保留两个带有公共访问说明符的类。一个有主管道,一个没有主管道。您将收到警告或错误。@Rahul:我看不出这与问题有什么关系。@nitish712整个事件与是否存在主要方法无关。我将检查您更新的问题。@nitish712:请查看我的编辑,但请尽量在每篇文章中保留一个问题。这正危险地转向“我一直在想我想问的其他问题……”这是我的错。类文件已生成。