Java中文件名和类名是否需要相同?

3
在Java中,文件名应与主类的文件名相同。这是告诉编译器这是入口点的方法。但为什么会这样呢?
class xyz{
public static void main(String[] args){
System.out.println("a");
}
}

即使使用不同的文件名保存,它仍然可以正常运行。

为什么使用不同的文件名保存时无法正常工作:

public class xyz{
public static void main(String[] args){
System.out.println("a");
}
}

5
类名与文件名相同的规则仅适用于“public”类。有关更多信息,请参见https://dev59.com/TXI95IYBdhLWcg3w1BlN。 - azurefrog
2
此外,类可能会在运行时动态生成,并且不对应任何文件。或者该类可能会从网络上下载,或从其他地方获取,这些地方可能不是磁盘上的文件。 - markspace
好问题 - JVM 的规范没有关于命名约定的说明;可能只是一种常识选择,所有实现都同意 - 虽然我会说相反的情况:文件名必须与类名匹配。 - Seismoid
如果我使用文件名编译它,然后通过调用具有主函数的类名来运行它,那么它可以工作,这是否意味着文件名不一定与类名相同?同时,这是否意味着我的代码中不一定需要一个公共类? - Moose
2个回答

10

公共类必须放在正确文件名的文件中。非公共类可以放在任何你想要的文件中,即使多个类在同一个文件中也可以,如果这样方便的话。


我知道这一点,但为什么呢?为什么一开始就是这样做的?有什么特定的原因吗? - Moose
1
https://dev59.com/TXI95IYBdhLWcg3w1BlN - khelwood
我已经阅读了这篇帖子。我的疑问是,即使是非公共类也可以拥有main方法,那么当jvm正在搜索入口点时,这不会对其构成问题吗? - Moose
孙先生引入了这个功能,以便jvm不必花时间搜索入口点,但是假设我的程序只有非公共类,其中一个类有一个主函数,那么这不就成了一个问题吗? - Moose
JVM 不会查看 .java 文件。在 JVM 到达它的时候,所有内容都在 .class 文件中,因此这不能是原因。 - khelwood
显示剩余2条评论

2
请注意:
class xyz

这不是一个公共类,因此无法从文件外部访问。因此,它不需要具有相同的名称。但在这种情况下:

public class xyz

您有一个公共类,它将从文件外部访问,因此它需要与文件名相同。

结论:公共类需要与文件名完全相同。


Sun引入了这个功能,以便jvm不必花费时间搜索入口点,但是假设我的程序只有非公共类,并且其中一个类有一个主函数,那么这不会成为一个问题吗? - Moose
1
我希望我能向你展示。 类xyz{ public static void main(String[] args){ System.out.println("a"); } }.. 这将运行。 - Moose
你是怎么运行的?终端?给我看一下命令。 - AndreDuarte
通过调用类名,使用Java xyz。 - Moose
1
你给我的链接里有一个答案,它说如果你用文件名编译它,然后用类名调用它,它就能工作。 - Moose
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接