当我在目录中只有HelloWorld.java而没有HelloWorld.class时,Windows cmd中的java HelloWorld引发了一个类未找到的异常.然而,java HelloWorld.java在没有制造HelloWorld.class的情况下被正确地执行.

据我所知,JVM读取扩展名为.class的文件的字节码,但无法读取.Java文件.我明白,java.exe只是一个创建和运行JVM的启动器,但现在我不明白它如何才能正确地与Java代码一起工作,而不是与字节代码一起工作.

推荐答案

TL;DR

在现代Java中,为了方便Java初学者,java应用程序将优雅地编译并运行一个.java文件.

可以将其视为java个应用程序检测源代码文件,然后将编译工作分包给javac个应用程序,将编译后的类缓存到内存中,最后继续运行新编译的类.

细节

JDKfew dozen toolsBundle 在一起.其中几个是至关重要的:

  • javac-将.java个源代码文本文件编译成.class个字节码文件.
  • java-通过启动JVM来执行.class文件.

处理步骤如下:

  1. 您可以在.java文件中编写Java源代码,包括class定义中的main方法.
  2. 您将该文件提交给编译器,例如每JDK个Bundle 的javac应用程序.
  3. 编译器输出一个.class文件.
  4. 您可以通过启动与每个JDKBundle 在一起的java应用程序来执行(运行)main方法.

您可以跳过一些步骤.

  • Compile and run a single file:
    As of Java 11, you can point the java app to a .java file. The java app will automatically compile first, as if javac were called on your behalf. Then the java app will go on to run the newly compiled class.
    • 不会将.class个文件写入存储.编译后的类缓存在内存中.
    • 有关所有详细信息,请参见JEP 330: Launch Single-File Source-Code Programs.
    • 这就是您注意到的行为:However, 100 was executed properly without making HelloWorld.class.
  • Simplified 101
    作为Java 21中的一项预览功能,您可以:

动机

Java团队正在齐心协力,为Java程序员的入门铺平道路,克服最初的障碍.他们试图掩盖一些精心设计的仪式,并使工具更友好和包容.

Java的底层 struct 和特性仍然存在.这不是Java的"低级".这些努力只是为了给初学者提供合理的住宿条件.

你好世界

将这些功能结合在一起,开始使用你好世界应用程序很简单,只需在HelloWorld.java文件中写入以下内容:

void main() {
    System.out.println("你好,世界!");
}

…然后在命令行调用:

java HelloWorld.java

控制台上的结果:

你好,世界!

对于一个全新的Java学生来说,这是一个巨大的劳动力减少和困惑.


JShell

顺便说一句,…让Java更易于使用的另一项措施是JShell,这是对Java的REPL.

无论是初学者还是专业人士,都发现JShell可以很方便地运行简短的Java代码,并能立即得到反馈.

BlueJ

对于初学者来说,另一个有用的工具是BlueJ,这是为学生设计的IDE.

Java相关问答推荐

@ EnableRouting注释在Kotlin项目中不工作

在spring—data中自动发现native—sql查询期间遇到重复的SQL别名[id]

Spring Batch 5-不要让它在数据库中自动创建表

为什么我们不能实现两个接口,其中一个接口有相同的签名,其中一个接口有默认的实现在java?'

springboot start loge change

只需最少的代码更改即可将版本号标记添加到日志(log)

RichFaces 3.x-Spring Boot-迁移web.xml

试着做一个2x2的魔方求解算法,我如何找到解路径(DFS)?

将响应转换为带值的键

SpringBoot:在条件{Variable}.isBlank/{Variable}.isEmpty不起作用的情况下进行路径变量验证

基于配置switch 的@Controller的条件摄取

FETCH类型设置为LAZY,但它仍会发送第二个请求

为什么这种递归会有这样的行为?

如何在ApacheHttpClient 5中为单个请求设置代理?

Java Flux中的延迟增加

无限递归Java问题

java21预览未命名的符号用于try-with-resources

Java中计算大n和k值模10^9+7的二项式系数的乘法公式输出错误值

如何调查进程列表中不可见的活跃 MySQL 事务?

语句打印在错误的行(Java Token 问题)