首先咱们话不多说先上代码!
public class Detail01{
public static void main(String[] args) {
test T= new test(10);
}
}
class test{
int a = 5;
test t = new test();
public test() {
System.out.print("执行无参构造");
}
public test(int a) {
System.out.print("执行有参构造");
System.out.print(this.a);
this.a = a;
System.out.print(this.a);
}
}
提问:这段代码会输出什么?
(不管你的答案是什么,选项中有没有你想要的结果,反正正确答案在选项中)
A: 执行有参构造 10 10;
B: 执行有参构造 5 10
C:执行有参构造 5 10 报错栈溢出
D:执行有参构造 5 10 执行无参构造
E:执行有参构造 5 10 执行无参构造 报错栈溢出
F:执行有参构造 报错栈溢出
G:报错栈溢出
H:答案中肯定没有的确的答案!!!!
有没有找到你想要的答案,首先排除H选项啊。其实答案很简单,你只要知道在创建一个对象时,在被创建的类中代码的执行顺序是什么就可以快速的找到答案。
我就不继续卖关子了首先答案是G报错栈溢出,为什么呢,我们先来看看创建对象时代码的执行顺序:
- 调用静态代码块和静态属性初始化
- 调用普通代码块和普通属性初始化
- 调用构造方法
知道了代码执行顺序相信聪明的兄弟已经知道答案是怎样来的了,不知道的兄弟也没关系我们来调试运行一下这些问题就都不是问题了。 首先我们将断点打在new对象这里。
接下来步入对象类,我们可以看到先到了类的有参构造函数但是并未执行,普通代码块未执行和普通属性未初始化。
继续下一步先执行代码块
继续下一步,开始普通成员变量的初始化
因为又一次new了test对象,所以继续下一步时程序将会重复上述步骤只不过进入的是无参构造,然后会一直重复上述步骤一直递归由于没有回溯,以及跳出递归的条件所以会栈溢出。