静态构造代码块、构造代码块、构造方法执行的顺序问题

版权声明:所有内容可随意转载 https://blog.csdn.net/weixin_41334738/article/details/83243832
/*
当前方法的执行结果是什么?请简述原理
 */
class Demo1 {
	static {
		Demo2 d = new Demo2();
	}
	{
		System.out.println("我是Demo1的构造代码块");
	}
	public Demo1() {
		System.out.println("我是Demo1的构造方法");
	}
}
class Demo2 {
	static {
		Demo1 d = new Demo1();
	}
	{
		System.out.println("我是Demo2的构造代码块");
	}
	public Demo2() {
		System.out.println("我是Demo2的构造方法");
	}
}
class Test {
	public static void main(String[] args) {
		Demo2 d2 = new Demo2();
		Demo1 d1 = new Demo1();
	}
}

执行结果是:
我是Demo2的构造代码块
我是Demo2的构造方法
我是Demo1的构造代码块
我是Demo1的构造方法
我是Demo2的构造代码块
我是Demo2的构造方法
我是Demo1的构造代码块
我是Demo1的构造方法

执行原理:
1.程序进入main方法中,程序跳到Demo2 d2 = new Demo2();
这里要创建Demo2的类对象,需要进到class Demo2里面
2.程序进入class Demo2 中,这里存在static静态构造代码块
程序先执行static里面的语句,Demo1 d = new Demo1(); 程序跳到了class Demo1中
(Demo2里的 代码块 和 构造方法被暂时搁置执行完static后再次执行)
3.当前程序进入了class Demo1里面 这里存在static静态构造代码块
先执行static里面的语句, Demo2 d = new Demo2(); 程序跳到了class里
(Demo1里的 代码块 和 构造方法被暂时搁置,执行完static后再次执行)
3. 当前程序进入了class Demo2中,静态代码块执行过,不再执行,构造代码块不会单独执行
所以程序先跳到public Demo2()上,不进入方法内部,而是调用构造代码块
这里执行了Demo2里的构造代码块,程序输出了第一行文字:
------------------------------------------“我是Demo2的构造代码块”
4. 当前程序在执行完Demo2里的代码块之后开始执行构造方法里的语句,输出第二行文字:
------------------------------------------“我是Demo2的构造方法”
5. 重点来了,程序从这里执行完之后再次进行跳转,跳转到第二次搁置代码的地方,也就是
再次跳回到class Demo1里面,执行刚才被搁置的语句,输出构造代码块构造方法的语句:
-------------------------------------------“我是Demo1的构造代码块”
-------------------------------------------“我是Demo1的构造方法”
6. class Demo1中被搁置的代码执行完之后,程序调到第一次搁置代码的地方
也就是第一次进入class Demo2执行后只执行了静态代码块,执行被搁置的语句:
代码块和构造方法
输出了两行语句:
-------------------------------------------“我是Demo2的构造代码块”
-------------------------------------------“我是Demo2的构造方法”
到这里main方法里面的第一行语句 才完全执行完

7.接下来程序跳到第二行语句 Demo1 d1 = new Demo1();
进入class Demo1里面去,进去跳到静态代码块上,发现静态代码块已经被执行过,不再执行
程序跳到 构造方法上,执行构造代码块,最后执行构造方法
程序会分别输出语句
-------------------------------------------“我是Demo1的构造代码块”
-------------------------------------------“我是Demo1的构造方法”
8.程序执行完毕

猜你喜欢

转载自blog.csdn.net/weixin_41334738/article/details/83243832