我有一个像这样的简单类(class):
class ClassWithDefaultConstructor{}
我正在使用这个 JDK:
C:\JavaSE14Folder>java -version
java version "14" 2020-03-17
Java(TM) SE Runtime Environment (build 14+36-1461)
Java HotSpot(TM) 64-Bit Server VM (build 14+36-1461, mixed mode, sharing)
如您所见,我使用的是最新版本的 JDK。
我像这样创建这个.class:
C:\JavaSE14Folder>javac -d . ClassWithDefaultConstructor.java
.class 是稍后在我尝试此命令时创建的:
C:\JavaSE14Folder>javap ClassWithDefaultConstructor.class
我看到以下内容:
Compiled from "ClassWithDefaultConstructor.java"
class ClassWithDefaultConstructor {
ClassWithDefaultConstructor();
}
这里有两件事让我很高兴;首先创建默认构造函数,我看到构造函数的可见性与类相同,但有三件事让人感到悲伤。
我的问题是:
- 为什么构造函数没有主体并以
;
终止? - 为什么构造函数没有调用 java.lang.Object 构造函数?
- 为什么这个类没有扩展
java.lang.Object
?
我确实期待这样的事情:
class ClassWithDefaultConstructor extends java.lang.Object {
ClassWithDefaultConstructor(){
super();
}
}
我期望字节码类似于这篇文章:
我错过了什么吗?
如果我这样输入命令:
C:\JavaSE14Folder>javap -c ClassWithDefaultConstructor.class
Compiled from "ClassWithDefaultConstructor.java"
class ClassWithDefaultConstructor {
ClassWithDefaultConstructor();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."
<init>":
()V
4: return
}
是不同的,但我仍然没有看到我的东西,比如扩展对象等等。
我希望看到这样的东西,至少像在帖子中一样:
Compiled from "test.java"
public class test extends java.lang.Object{
总之,我没有看到编译器插入这些隐式行。
在此Java Question about a .class generated with Java 14声明在较新版本的 Java 上也会发生同样的情况。
使用相同的输出:
C:\Program Files\Java\jdk1.8.0_121\bin
最佳答案
字节码!= Java 源代码。
类文件中的实际上只是随机字节。您所看到的是 javap
字节码的文本表示形式,它旨在让不太了解字节码的 Java 程序员熟悉,因此尽可能使用类似 Java 的语法。但它不是、也不意味着是实际的 Java 源代码。
如果您使用不同的反汇编程序,例如 Krakatau ,输出看起来会非常不同,但它仍然是同一二进制类文件的表示。
关于关于使用 Java 14 生成的 .class 的 Java 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60981074/