运行.class或.java之间有有意义的区别吗?

问题描述

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

运行
java -cp . HelloWorldApp

当我尝试运行它时,我没有运行正确的文件,而是意外地运行了

java helloworldapp.java

在我注意到这一点之后,我尝试了原始方式,并且都将其打印

Hello World!

这让我开始思考,将其作为已编译的.class与原始源代码.java进行运行有什么区别?

解决方法

在Java 11中,现在大多数情况下可以运行“ java ”,以帮助您熟悉以下语言:https://openjdk.java.net/jeps/330

在幕后,它首先是编译源文件,然后运行已编译的类。对于更简单的用例(例如:1个文件Java程序,没有依赖项),其行为可能是相同的,但是值得注意的是,这通常并不意味着“先编译后执行”。

,

将其作为已编译.class运行与原始源代码.java之间几乎没有区别。

但是,直接运行.java源文件的功能是一种方便,并且有以下限制:

  • 最严重的限制是它仅支持单源程序。如果您在多个源文件中包含类,则无法使用此功能。

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

  • 重新运行程序需要重新编译源代码,因此启动程序会慢一些。

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

当然,由于您应该使用 IDE 开发Java程序,所以这实际上没有关系。这意味着该功能恢复为JEP 330: Launch Single-File Source-Code Programs中指定的原始用途,即运行#! shebang脚本的用途。