具有文件扩展名的java文件编译

具有文件扩展名的java文件编译,java,javac,Java,Javac,当我们编译java程序时,我们使用javac file.java命令,但在运行时,我们使用java file 那么,为什么在编译时需要显式指定文件扩展名,而在运行java程序时不需要呢?因为在“运行”java.class编译文件时,您告诉java应用程序启动器哪个类包含主方法。启动器启动Java运行时环境并加载指定的类 如果编写javamyclass,那么使用main方法的类就是MyClass。请注意,编写javamyclass.class是错误的,因为MyClass.class不是类的名称 当

当我们编译java程序时,我们使用
javac file.java
命令,但在运行时,我们使用
java file

那么,为什么在编译时需要显式指定文件扩展名,而在运行java程序时不需要呢?

因为在“运行”java.class编译文件时,您告诉java应用程序启动器哪个类包含主方法。启动器启动Java运行时环境并加载指定的类

如果编写
javamyclass
,那么使用main方法的类就是
MyClass
。请注意,编写
javamyclass.class
是错误的,因为
MyClass.class
不是类的名称

当您使用
javacmyclass.java
编译时,您需要告诉java编译器扩展名,因为它是一个文件,需要找到它

那么,为什么在编译时需要显式指定文件扩展名,而在运行java程序时不需要

因为这就是工具的实现方式:

  • javac
    命令需要文件路径名
  • java
    命令需要java类名
20多年前,它们就是这样实现的,对向后兼容性的需求已经超过了对更改的需求1

没有必要这样设计工具。(他们本可以做得不同。)但关于他们为什么这样设计的讨论如下:

  • 讨论(主题外)
  • 基于意见(主题外),以及
  • 模拟


1-如果工具工作方式不同,对初学者来说会更好。然而,如果新手注意,理解这些工具其实并不难。。。。并且费心去阅读文档和/或一个像样的教程和/或在课堂上听。

谢谢。我现在明白我的疑问了。因为一个java文件可以包含相同数量的类,但只能包含一个
main()
class。因此,在运行时,我们只需要指定包含
main()
@SanTech的类名-实际上,您的推理是错误的。1) 无法运行“.java”文件,因为它未编译。(它可以包含多个类的事实是没有意义的。)2)一个“.class”文件将只包含一个编译过的类。因此,运行
javamyclass.class
。。。但它不是那样工作的。3) 真正的原因很简单。这样做是因为
java
命令就是这样工作的。好的。更简单的是,
javac
命令使用文件进行编译,
java
命令使用类名进行运行。此外,类文件可以位于类路径上的任何位置,如果提供了类路径,甚至可以位于JAR文件中。您没有指定类文件;您可以指定完全限定的类名,并让类加载器确定它在哪里。不,在运行时,我们使用
java
。不一样。