![](/img/trans.png)
[英]Does a parent class always need a default or no-argument constructor even if the child class already has a defined constructor?
[英]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.