Java:Object类有构造函数吗?

shr*_*000 27 java constructor

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

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

public ConTest()
{
    new Throwable().printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

结果:

java.lang.Throwable
    at ConTest.<init>(ConTest.java:8)
    at ConTest.main(ConTest.java:16)
Run Code Online (Sandbox Code Playgroud)

Ale*_*øld 24

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

更明确的代码版本:

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


Str*_*lok 6

您没有在堆栈跟踪中看到它,因为它已被调用.您的代码中会抛出异常.

您的代码等同于编写:

public ConTest() {
  super(); // this will call the Object constructor
  new Throwable().printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)


And*_*ter 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
}
Run Code Online (Sandbox Code Playgroud)


小智 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

}
Run Code Online (Sandbox Code Playgroud)

谢谢