關於java中代碼塊和構造函數的加載順序以及父類和子類中的加載順序

首先,我們簡單瞭解一下代碼塊和構造方法

靜態代碼塊:

存在類內方法外,使用static修飾,作用是類的預加載,當類第一次被加載的時候執行一次,優先於構造代碼塊 優先於構造方法
構造代碼塊:

存在類內方法外,作用是對象的預加載,每當new調用構造方法的時候 會優先執行構造代碼塊,每new一次就優先執行一次構造代碼塊

普通代碼塊:

存在成員方法中,作用是控制變量的生命週期,執行完後立即消失.
構造方法:

創建對象的方式,每當調用構造方法時,構造方法執行一次 

關於加載順序,我們將通過實現代碼來查看

一、定義一個父類

public class Die {
	int age;

	static {
		System.out.println("父類的靜態代碼塊");
	}

	{
		// 父類的構造代碼塊
		System.out.println("父類的構造代碼塊");
	}

	// 父類無參
	public Die() {
		this(20);
		System.out.println("父類的無參構造方法");
		// 普通代碼塊
		{
			System.out.println("父類的代碼塊");
		}
	}

	// 父類含參
	public Die(int age) {
		super();
		this.age = age;
		System.out.println("父類的含參構造方法");

	}

}

二、定義一個子類

public class Zi extends Die{
	String name;
	static{
		System.out.println("子類的靜態代碼塊");
	}
	
	{
		//構造代碼塊
		System.out.println("子類的構造代碼塊");
	}
	
	//子類無參
	public Zi() {
		this("");//在執行子類的含參構造方法 但是沒有對象產生
		System.out.println("子類無參構造方法");
		//普通代碼塊
		{
			System.out.println("子類的代碼塊");
		}
	}

	//子類含參
	public Zi(String name) {
		super();
		this.name = name;
		System.out.println("子類的含參構造");
	}
	
}

三、測試類

public class ExtendsDemo {
	public static void main(String[] args){
		Zi z = new Zi();
		System.out.println("==========");
		Die d = new Zi();
	}
}

結果:

Zi z = new Zi()    的運行結果:
父類的靜態代碼塊
子類的靜態代碼塊
父類的構造代碼塊
父類的含參構造方法
父類的無參構造方法
父類的代碼塊
子類的構造代碼塊
子類的含參構造
子類無參構造方法
子類的代碼塊
Die d = new Zi()    的運行結果:
父類的構造代碼塊
父類的含參構造方法
父類的無參構造方法
父類的代碼塊
子類的構造代碼塊
子類的含參構造
子類無參構造方法
子類的代碼塊

靜態代碼塊只加載一次,所以第二次沒有加載靜態代碼塊

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