Java:Object class 有构造函数吗?

2022-09-01 14:17:19

Javadoc 提到 Object 类有一个公共的 no-arg 构造函数。但是Object的源代码中没有任何显式构造函数。所以很明显,编译器已经为它生成了一个。但是,如果我在构造函数即将返回时看到调用堆栈跟踪(如下所示),则我不会在该跟踪中看到任何调用。Object.<init>

所以问题是,对象类是否像文档所说的那样有默认构造函数?如果是,为什么我在调用堆栈跟踪中看不到它?

public ConTest()
{
    new Throwable().printStackTrace();
}

结果:

java.lang.Throwable
    at ConTest.<init>(ConTest.java:8)
    at ConTest.main(ConTest.java:16)

答案 1

超级构造函数在子/基构造函数之前运行。在您的示例中,Object 的构造函数在执行时已经运行。new Throwable().printStackTrace()

更明确的代码版本:

public ConTest()
{
    super();
    new Throwable().printStackTrace(); // you will not see super() (Object.<init>) in this stack trace.
}

答案 2

您不会在堆栈跟踪中看到它,因为它已被调用。将在代码中引发异常。

您的代码相当于编写:

public ConTest() {
  super(); // this will call the Object constructor
  new Throwable().printStackTrace();
}