0

人们说Java中有一些代码是强制性的,即使程序员没有编写它们。Java 编译器自己隐式地编写它。

就像我的代码是这样的

class Test {

    public static void main(String args[]) {
        Test obj = new Test();
    }
}

我这里没有写默认构造函数,这意味着Java编译器会自己隐式编写。

这意味着我的 Test.class 文件中有一个默认构造函数。

如果我反编译我的 Test.class 文件,它应该看起来像这样

class Test {

    Test() {
        super();
    }

    public static void main(String args[]) {
        Test obj = new Test();
    }
}

为什么在我反编译时它没有在我的 java 文件中显示任何默认构造函数?

4

1 回答 1

1

您的反编译器可能不一定显示默认 ctor,因为它知道它的隐含性。这是该编译器的实现者的设计决定,并且可以通过某些设置进行配置。

但是,它显然以字节码的形式存在——编译以下 java 代码:

class A {}

然后用javap -c A.class显示默认构造函数来反汇编它:

Compiled from "A.java"
class A {
  A();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
}

当然,它除了 load 什么都不做this,将它压入堆栈,然后调用无参数超类 ctor。

于 2021-10-14T18:53:20.950 回答