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)
您没有在堆栈跟踪中看到它,因为它已被调用.您的代码中会抛出异常.
您的代码等同于编写:
public ConTest() {
super(); // this will call the Object constructor
new Throwable().printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
您没有在堆栈跟踪中看到它,因为在调用之前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)
谢谢
| 归档时间: |
|
| 查看次数: |
8961 次 |
| 最近记录: |