靜態構造塊,構造塊 構造函數以及 靜態構造塊調用構造對象的 執行次序

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

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