运行 .class 或 .java 之间是否存在有意义的差异?

Is there a meaningful difference between running .class or .java?

我开始 Java,并且正在阅读来自 Oracle 的 "Hello World!" for Microsoft Windows 指南。在指南中,它告诉您使用javac 编译成.class,然后运行 和

java -cp . HelloWorldApp

当我尝试 运行 时,我没有 运行 正确的文件,而是不小心 运行

java helloworldapp.java

我注意到之后,我尝试了原来的方式,他们都打印了

Hello World!

这让我开始思考,运行编译后的 .class 与原始源代码 .java 有什么区别吗?

在 Java 11 中,现在可以 运行 'java <source_file>' 主要是为了帮助熟悉该语言:https://openjdk.java.net/jeps/330

在幕后,它首先编译源文件,然后 运行编译编译后的文件 class。对于更简单的用例(例如:1 个文件 java 程序,没有依赖项),行为可能是相同的,但值得注意的是,这并不意味着通常替代 'compile then execute' .

运行编译后的 .class 与原始源代码 .java.

之间几乎没有区别

但是,直接 运行 .java 源文件的能力 很方便 ,并且有局限性:

  • 最严重的限制是它只支持single-source程序。如果在多个源文件中有类,则无法使用此功能。

  • 对指定编译器选项的支持有限。更高级的使用,需要直接调用编译器。

  • Re-running程序需要re-compiling源码,所以启动程序会慢一些。

但是,除了那些限制之外,除了只需要 运行 一个命令的便利之外,真的没有区别。

当然,因为您应该使用 IDE 开发 Java 程序,所以这并不重要。这意味着该功能恢复到其原始目的,如 JEP 330: Launch Single-File Source-Code Programs 中指定的那样,即 运行ning #! shebang 脚本的目的。