Java:对象类有构造函数吗?
Javadoc提到对象类有一个公共的无参数构造函数。但对象的源代码中并没有任何显式构造函数。显然编译器已经为它生成了一个。但是,如果在构造函数即将返回时看到调用堆栈跟踪(如下所示),则在该跟踪中看不到对Java:对象类有构造函数吗?,java,constructor,Java,Constructor,Javadoc提到对象类有一个公共的无参数构造函数。但对象的源代码中并没有任何显式构造函数。显然编译器已经为它生成了一个。但是,如果在构造函数即将返回时看到调用堆栈跟踪(如下所示),则在该跟踪中看不到对对象的任何调用。 所以问题是,对象类是否有文档中所说的默认构造函数?如果是,为什么在调用堆栈跟踪中看不到它 public ConTest() { new Throwable().printStackTrace(); } 结果: java.lang.Throwable at Con
对象的任何调用。
所以问题是,对象类是否有文档中所说的默认构造函数?如果是,为什么在调用堆栈跟踪中看不到它
public ConTest()
{
new Throwable().printStackTrace();
}
结果:
java.lang.Throwable
at ConTest.<init>(ConTest.java:8)
at ConTest.main(ConTest.java:16)
java.lang.Throwable
在竞赛中。(ConTest.java:8)
在ConTest.main(ConTest.java:16)
超级构造函数在子/基构造函数之前运行。在您的示例中,当执行new Throwable().printStackTrace()
时,对象的构造函数已经运行
更明确的代码版本:
public ConTest()
{
super();
new Throwable().printStackTrace(); // you will not see super() (Object.<init>) in this stack trace.
}
公开竞赛()
{
超级();
new Throwable().printStackTrace();//在此堆栈跟踪中不会看到super()(Object.)。
}
您在堆栈跟踪中看不到它,因为它已被调用。异常将在代码中引发
您的代码相当于编写:
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
}
如上所述,super()是构造函数中的第一个调用,有关详细信息,请参阅方法
编译类时,Java编译器会为在类的源代码中声明的每个构造函数创建一个实例初始化方法。尽管构造函数不是方法,但实例初始化方法是。它有一个名称,
,一个返回类型,void,以及一组与生成它的构造函数的参数相匹配的参数
是的,如文档所述,对象类有一个默认构造函数。 正如您所知,您可以通过在命令提示符中使用javap-c ConTest来检查它 您可以看到它在下面代码的第1行调用对象类default constructor()
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
}
C:\stackdemo>javap-C竞赛
从“ConTest.java”编译而来
公共类竞赛扩展了java.lang.Object{
公开竞赛();
代码:
0:aload_0
1:invokespecial#1;//方法java/lang/Object。“:()V
4:new#2;//类java/lang/Throwable
7:dup
8:invokespecial#3;//方法java/lang/Throwable。”“:()V
11:invokevirtual#4;//方法java/lang/Throwable.printStackTrace:()V
14:返回
公共静态void main(java.lang.String[]);
代码:
0:new#5;//班级竞赛
3:dup
4:invokespecial#6;//方法“”:()V
7:astore_1
8:返回
}
谢谢hmm所有类都至少有一个构造函数。如果类没有显式声明,Java编译器会自动提供一个无参数构造函数,称为默认构造函数。如果该类没有其他父类,则默认为对象构造函数。是否可以接受多个答案?因为我想接受下面给出的所有4个答案。奇怪,@shrini1000,你是对的,它不在源代码中,我检查了Java1.8.0241。但是它在在线java文档中,我从Java13一直检查到8,Object()构造函数已经定义。