即使已定义,Java也需要运行.class文件

时间:2015-09-27 16:40:05

标签: java eclipse

我今天刚刚启动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时,它会失败。当我运行这个程序时,Eclipse还创建了一些.class文件,但如果我在另一个目录中运行.java,那么为什么它会失败是没有多大意义的。 class Example文件中可以找到.java的信息。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

以下是发生的事情的流程图:

enter image description here

更深入地了解一下:

当您的Java项目构建时,它会将源代码(包含在*.java源文件中)转换为Java bytecode(通常包含在*.class文件中)。这使您的高级代码更接近机器代码,但尚未完成。 bytecode是紧凑指令的集合;机器更易于理解,但可读性较差。

当您在计算机,手机或任何其他支持Java的平台上运行Java应用程序时,您实际上将此Java bytecode传递给Java虚拟机。 Java虚拟机中的解释器通常在运行时开始编译整个bytecode,遵循所谓的实时编译的原则。这在打开Java应用程序时会产生典型的(通常是轻微的延迟),但与解释的编译相比通常会提高程序性能。

答案 1 :(得分:1)

  

Java是否需要编译和运行.class文件,尽管程序中已经定义了类本身以及为什么

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

  

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

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

  

例如:
  文件名: example.java
  编译代码: javac example.java
  输出为.class文件: Example.class。因为班级名称是Example   运行程序: java示例

  

代码出错。 在问题中看起来已经更新了。

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

班级名称为Example而不是Student。它应该是:

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