我知道在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
文件。为什么会这样?
答案 0 :(得分:1)
你的观察是正确的。如果类不是公共的,则类的名称不需要与文件名匹配。如果文件中没有公共类,则可以根据需要为文件命名。
如果你说有一个源文件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
答案 1 :(得分:1)
是的,这绝对没问题。即使对于公共类,这也是特定于编译器的可选限制。
当且仅当包存储在文件系统(第7.2节)中时,如果在由组成的名称下的文件中找不到类型,则主机系统可以选择强制执行编译时错误的限制。如果满足以下任一条件,则类型名称加上扩展名(例如.java或.jav):
该类型由声明类型的包的其他编译单元中的代码引用。
该类型声明为public(因此可以从其他包中的代码访问)。
请注意第二个要点 - 当您的班级不公开时,此限制不适用。
编辑:从更新的问题......
当同一个文件中有两个这样的类时会发生什么?
基于类名生成类文件。 main
方法的存在与完全无关,原始源文件名也是如此。如果编译成功,则必须生成 类文件。如果没有示例代码来重现问题,我们无法确定真正发生的事情。