[英]Java: does Object class have a constructor?
Javadoc提到Object类有一个public no-arg构造函数。 但是Object的源代码中没有任何显式的构造函数。 显然编译器为它生成了一个。 但是,如果我在构造函数即将返回时看到调用堆栈跟踪(如下所示),我在该跟踪中看不到对Object.<init>
任何调用。
所以问题是,Object类是否有一个默认的构造函数,正如doc所说的那样? 如果是,为什么我在调用堆栈跟踪中看不到它?
public ConTest()
{
new Throwable().printStackTrace();
}
结果:
java.lang.Throwable
at ConTest.<init>(ConTest.java:8)
at ConTest.main(ConTest.java:16)
超级构造函数在子/基础构造函数之前运行。 在您的示例中,在执行new Throwable().printStackTrace()
时,已经运行了Object的构造函数。
更明确的代码版本:
public ConTest()
{
super();
new Throwable().printStackTrace(); // you will not see super() (Object.<init>) in this stack trace.
}
您没有在堆栈跟踪中看到它,因为它已被调用。 您的代码中会抛出异常。
您的代码等同于编写:
public ConTest() {
super(); // this will call the Object constructor
new Throwable().printStackTrace();
}
您没有在堆栈跟踪中看到它,因为在您的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
}
是的,正如文档所说,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
}
谢谢
如上所述,super()是构造函数中的第一个调用,而这里是方法更多信息
编译类时,Java编译器会为您在类的源代码中声明的每个构造函数创建实例初始化方法。 虽然构造函数不是方法,但实例初始化方法是。 它有一个名称,
<init>
,一个返回类型,void和一组参数,这些参数匹配生成它的构造函数的参数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.