27

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

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

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

结果:

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

5 回答 5

24

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

更明确的代码版本:

public ConTest()
{
    super();
    new Throwable().printStackTrace(); // you will not see super() (Object.<init>) in this stack trace.
}
于 2012-08-22T05:57:59.740 回答
6

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

您的代码相当于编写:

public ConTest() {
  super(); // this will call the Object constructor
  new Throwable().printStackTrace();
}
于 2012-08-22T05:59:39.527 回答
6

您在堆栈跟踪中看不到它,因为在您new Throwable().printStackTace()调用之前调用了超类的构造函数。编译器实际创建的内容如下。

public ConTest()
{
    super();   // This is the call to the base class constructor
    new Throwable().printStackTrace();   // already back from the base class constructor
}
于 2012-08-22T06:00:33.763 回答
6

是的,正如文档所说,Object 类有一个默认构造函数。

如您所知,您可以通过在命令提示符下使用 javap -c ConTest 来检查它,您可以在下面的代码行号:1中看到它正在调用对象类默认构造函数()

C:\stackdemo>javap -c ConTest
Compiled from "ConTest.java"
public class ConTest extends java.lang.Object{
public ConTest();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   new     #2; //class java/lang/Throwable
   7:   dup
   8:   invokespecial   #3; //Method java/lang/Throwable."<init>":()V
   11:  invokevirtual   #4; //Method java/lang/Throwable.printStackTrace:()V
   14:  return

public static void main(java.lang.String[]);
  Code:
   0:   new     #5; //class ConTest
   3:   dup
   4:   invokespecial   #6; //Method "<init>":()V
   7:   astore_1
   8:   return

}

谢谢

于 2012-10-05T12:00:44.670 回答
2

如上所述 super() 是构造函数和方法中的第一个调用更多信息here

当您编译一个类时,Java 编译器会为您在该类的源代码中声明的每个构造函数创建一个实例初始化方法。虽然构造函数不是方法,但实例初始化方法是。它有一个名称、<init>一个返回类型、void 和一组参数,这些参数与生成它的构造函数的参数相匹配

于 2012-08-22T06:04:47.840 回答