当目录中只有HelloWorld.java
而没有HelloWorld.class
时,Windows cmd中的java HelloWorld
引发了一个class not found异常。但是,java HelloWorld.java
在没有生成HelloWorld.class
的情况下被正确执行。
据我所知,JVM读取扩展名为.class的文件的字节码,但无法读取.java文件。我知道java.exe只是一个创建JVM并运行它的启动器,但现在我很困惑它如何与Java代码一起正常工作,而不是字节码。
3条答案
按热度按时间5lwkijsr1#
tl;dr
在现代Java中,为了方便初学Java的学生,java 应用程序将优雅地编译,然后运行
.java
文件。把它想象成 java app检测一个源代码文件,然后把编译工作分包给 javac app,把编译后的类缓存在内存中,最后继续运行新编译的类。
详情
JDK与few dozen tools捆绑在一起。其中有几个是至关重要的:
.java
源代码文本文件编译为.class
字节码文件。.class
文件。工艺步骤为:
1.您可以在
.java
文件中编写Java源代码,包括class
定义中的main
方法。1.您可以将该文件提交给编译器,例如与每个JDK捆绑的 javac 应用程序。
1.编译器输出一个
.class
文件。1.您可以通过启动与每个JDK捆绑的 java 应用程序来执行(运行)
main
方法。你可以跳过一些步骤。
*编译 * 和 * 运行单个文件:
从Java 11开始,您可以将 java 应用程序指向
.java
文件。java 应用程序将首先自动编译,就好像 javac 是代表你调用的一样。然后,java 应用程序将继续运行新编译的类。.class
文件写入存储。编译后的类缓存在内存中。java HelloWorld.java
在没有生成HelloWorld.class的情况下正确执行。**简化
main
作为Java 21中的预览功能,您可以:
java
文件时不声明类。只需单独编写main
方法,周围什么都不需要。main
方法声明中删除public static
。动机
Java团队正在共同努力,为Java程序员的初学者铺平道路,以消除最初的速度障碍。他们试图掩盖一些精心制作的仪式,并使工具更加友好和包容。
Java的底层结构和特性仍然存在。这并不是Java的“简化”。这些努力只是试图为初学者提供合理的便利。
Hello World
结合这些功能,开始使用 Hello World 应用程序很简单,只需在
HelloWorld.java
文件中编写以下内容:然后在命令行上调用:
控制台上的结果:
你好,世界!
对于一个Java的新学生来说,这是一个巨大的劳动力和混乱的减少。
jshell
顺便说一下..另一个让Java更容易使用的东西是jshell,一个Java的REPL。
初学者和专业人士都发现 jshell 可以方便地运行简短的Java代码,并提供即时反馈。
BlueJ
另一个对初学者有用的工具是BlueJ,一个为学生设计的IDE。
oug3syen2#
如JEP-330中所述,对于您的示例,
非正式地等同于
piah890a3#
自Java 9以来,我们有
jshell
作为Java语言的REPL工具(REPL与Python相同),Java代码源的交互式解释器。从Java 11开始,您可以在
java
命令的帮助下执行JVM字节码或解释Java源代码(源文件模式)(参见https://openjdk.org/jeps/330)。该文件的摘录如下:从JDK 10开始,java启动器以三种模式运行:启动一个类文件,启动一个类文件的主类,或者启动一个模块的主类。在这里我们添加了一个新的第四种模式:启动在源文件中声明的类。
口译员是如何工作的?这(几乎)是没有兴趣的,但极有可能是在引擎盖下进行的一些编译步骤。