当我的目录中只有 HelloWorld.java
而没有 HelloWorld.class
时,Windows cmd 中的 java HelloWorld
引发了类未找到异常。但是,java HelloWorld.java
已正确执行,无需生成 HelloWorld.class
。
据我了解,JVM读取扩展名为.class的文件的字节码,但无法读取.java文件。我知道 java.exe 只是一个创建 JVM 并运行它的启动器,但现在我很困惑它如何与 java 代码而不是字节代码正常工作。
最佳答案
tl;博士
在现代 Java 中,为了方便 Java 初学者,java 应用程序将优雅地编译并运行 .java
文件。
将其视为 java 应用程序检测源代码文件,然后将编译工作分包给 javac 应用程序,将编译后的类缓存在内存中,然后最后继续运行新编译的类。
详细信息
一个JDK捆绑有 few dozen tools 。其中有几个至关重要:
流程步骤是:
- 您在
.java
文件中编写 Java 源代码,其中包括class
定义中的main
方法。 - 您将该文件提交给编译器,例如与每个 JDK 捆绑在一起的 javac 应用程序.
- 编译器输出一个
.class
文件。 - 您可以通过启动与每个 JDK 捆绑在一起的 java 应用程序来执行(运行)
main
方法。
您可以跳过一些步骤。
- 编译并运行单个文件:
从 Java 11 开始,您可以将 java 应用程序指向.java
文件。 java 应用程序将首先自动编译,就像 javac 被代表您调用一样。然后java应用程序将继续运行新编译的类。- 没有
.class
文件写入存储。编译后的类缓存在内存中。 - 参见JEP 330: Launch Single-File Source-Code Programs了解所有详细信息。
- 您注意到了这种行为:但是,
java HelloWorld.java
已正确执行,而没有生成 HelloWorld.class。
- 没有
- 简化的
main
作为 Java 21 中的预览功能,您可以:- 编写
java
文件而不声明类。只需单独编写main
方法,周围什么都没有。 - 从
main
方法声明中删除public static
。 - 参见JEP 445: Unnamed Classes and Instance Main Methods (Preview)了解详情。
- 编写
动机
Java 团队正在共同努力,为初级 Java 程序员提供便利,以消除最初的障碍。他们试图掩盖一些复杂的仪式,并使工具更加友好和包容。
Java 的底层结构和特性仍然存在。这并不是 Java 的“简化”。这些努力只是为初学者提供合理便利的尝试。
Hello World
结合这些功能,开始使用 Hello World 应用程序非常简单,只需在 HelloWorld.java
文件中编写以下内容即可:
void main() {
System.out.println("Hello, World!");
}
…然后在命令行上调用:
java HelloWorld.java
控制台结果:
Hello, World!
对于 Java 新手来说,这大大减少了工作量并减少了困惑。
jshell
顺便说一句...另一个使 Java 更易于使用的部分是 jshell ,一个REPL对于 Java。
初学者和专业人士都发现 jshell 可以方便地运行简短的 Java 代码并提供即时反馈。
BlueJ
关于java - java.exe如何执行java源代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77114812/