繁体   English   中英

Java是否需要.class文件才能运行(即使已定义)

[英]Does Java need .class files to run even if defined

我今天刚刚启动Java,运行代码时遇到了NoClassDefFoundError:

class Example {

    public static final String greeting = "Hi there";

    public static void main(String[] args) {
        System.out.format("%s", Example.greeting);
    }
}

以上是我的example.java代码的内容。 这段代码在Eclipse执行中可以正常编译,但是当我尝试example.java运行example.java ,它会失败。 当我运行该程序时,Eclipse还创建了一个.class文件,但这并不能说明为什么如果我在另一个目录中.java运行.java会失败,因为class Example所有信息都在.java文件本身。

尽管在程序中定义了类本身,Java是否仍需要.class文件进行编译和运行,为什么? 我还通过终端构建了.java文件,它运行良好

Java程序的编译和执行是两个步骤:

  • 在编译阶段,Java编译器将编译源代码并生成bytecode 此中间bytecode.class file形式保存。

  • 在第二阶段,Java虚拟机(JVM)也称为Java解释器,将.class作为输入并通过执行bytecode生成输出。

因此, .class文件对于执行代码至关重要。 .java文件是您编写的文本,但不是机器可以解释的文本。

这是发生的情况的流程图:

在此处输入图片说明

要更深入地研究它:

在构建Java项目时,它将源代码(包含在*.java源文件中)转换为Java bytecode (通常包含在*.class文件中)。 这使您的高级代码更接近机器代码,但还远远不够。 bytecode是紧凑指令的集合。 机器更容易解释,但可读性较差。

当您在计算机,手机或任何其他支持Java的平台上运行Java应用程序时,实际上是将此Java bytecode传递给Java虚拟机。 Java虚拟机中的解释器通常会在运行时按照所谓的即时编译原则开始编译整个bytecode 这通常会导致打开Java应用程序时出现典型的延迟,尽管通常会稍有延迟,但是与解释编译相比,通常可以提高程序性能。

尽管在程序中定义了类本身,Java是否仍需要.class文件来编译和运行?为什么

Java文件(类)的编译输出是.class文件。 它包含由JVM运行的程序的bytecode 因此,运行该程序需要.class文件。

我还通过终端构建了.java文件,它运行良好

即使通过终端,当您编译.java文件(类)时。 它为.java文件中声明的每个类创建.class 然后,执行包含main方法的类。 main方法是JVM的入口点。

例如:
文件名: example.java
编译代码: javac example.java
输出为.class文件: Example.class 因为该类的名称为Example
运行程序: java示例

代码错误。 看起来这个问题已经更新。

System.out.format("%s", Student.greeting);

班级的名称是Example not Student 它应该是:

System.out.format("%s", Example.greeting);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM