天天看點

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

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