静态构造块,构造块 构造函数以及 静态构造块调用构造对象的 执行次序

1.执行顺序:
静态构造块 (bean初始语句之前) → (bean初始语句之后)构造块 → 构造函数 → (bean初始化)
2.有继承的情况
父类静态构造快 → 子类静态构造块 → 父类构造块 → 父类构造函数 → 子类构造块 → 子类构造函数
3.必须要明白的
静态块:用static申明,JVM加载类时执行,仅执行一次(也就是某对象在第一次创建之后,第二次就不会执行),第一个静态块还没有执行好,后面的静态块都不会执行
构造块:类中直接用{}定义,每一次创建对象时执行
4.下面是一些演示,以及相关解释

package com;

public class Hen {
	String master;

	public String getMaster() {
		return master;
	}

	public void setMaster(String master) {
		this.master = master;
	}

	static {
		System.out.println("hen静态构造块1");
		System.out.println("<<<<<<<<内部start<<<<<<<<<");
		Hen hen = new Hen("内部hen");
		System.out.println("<<<<<<<<内部end<<<<<<<<<");
	}
	
	{
		System.out.println("hen构造块1");
	}

	static {
		System.out.println("hen静态构造块2");
	}
	
	{
		System.out.println("hen构造块2");
	}

	public Hen() {
		super();
	}

	public Hen(String master) {
		super();
		this.master = master;
		System.out.println("hen构造函数");
	}
	
}

package com;

public class Egg extends Hen {
	String master;

	public String getMaster() {
		return master;
	}

	public void setMaster(String master) {
		this.master = master;
	}

	static {
		System.out.println("egg静态构造块");
	}

	{
		System.out.println("egg构造块");
	}

	public Egg() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Egg(String master) {
		super();
		this.master = master;
		System.out.println("egg构造函数");
	}

}

package com;

public class Main {
	public static void main(String[] args) {
		System.out.println("--------start------");
		Hen hen1 = new Hen("hen1");
		System.out.println("---------end-------");
		System.out.println("--------start------");
		Hen hen2 = new Hen("hen2");
		System.out.println("---------end-------");
		System.out.println("--------start------");
		Egg egg1 = new Egg("egg1");
		System.out.println("---------end-------");
		System.out.println("--------start------");
		Egg egg2 = new Egg("egg2");
		System.out.println("---------end-------");

	}
}


输出为:

--------start------
hen静态构造块1
<<<<<<<<内部start<<<<<<<<<
hen构造块1
hen构造块2
hen构造函数
<<<<<<<<内部end<<<<<<<<<
hen静态构造块2
hen构造块1
hen构造块2
hen构造函数
---------end-------
--------start------
hen构造块1
hen构造块2
hen构造函数
---------end-------
--------start------
egg静态构造块
hen构造块1
hen构造块2
egg构造块
egg构造函数
---------end-------
--------start------
hen构造块1
hen构造块2
egg构造块
egg构造函数
---------end-------

相关的解释:
遵照1,2,3,所述:

Hen hen1 = new Hen("hen1");

静态块仅执行一次,且最先执行,所以输出

hen静态构造块1

又hen静态快1中创建了内部的hen,第一个静态块还没有执行好,所以,后面的静态块都不会执行,所以根据上面的执行顺序,先构造块,后构造函数,输出为:

hen构造块1
hen构造块2
hen构造函数

然后继续执行Main方法的第一个新建,输出为:

hen静态构造块2
hen构造块1
hen构造块2
hen构造函数

因为static静态块只执行一次,所以第二次创建对象的时候,输出为:

hen构造块1
hen构造块2
hen构造函数

Egg继承了Hen,但是Hen的静态块已经执行过了,所以跟据上面的执行顺序,输出为:

egg静态构造块
hen构造块1
hen构造块2
egg构造块
egg构造函数

同理,再次创建时,输出为:

hen构造块1
hen构造块2
egg构造块
egg构造函数

5.参考文档:https://blog.csdn.net/qq_42128262/article/details/89191300

https://blog.csdn.net/zzzzzztt/article/details/79839914?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章