程式碼說事 之 建立java物件的初始化順序

HUBUGUI456發表於2020-04-06
package util;
/**
 * 類初始化順序:
 *父類靜態程式碼塊--->子類靜態程式碼塊--->父類程式碼塊--->父類構造方法--->子類
 *程式碼塊--->子類構造方法
 *1.  父類靜態成員和靜態初始化塊 ,按在程式碼中出現的順序依次執行 
 *2.  子類靜態成員和靜態初始化塊 ,按在程式碼中出現的順序依次執行 
 *2.  父類例項成員和例項初始化塊 ,按在程式碼中出現的順序依次執行 
 *4.  父類構造方法
 *5.  子類例項成員和例項初始化塊 ,按在程式碼中出現的順序依次執行 
 *6.  子類構造方法
 * @author zhiziwei
 * 
 */
public class ObjectInit {
	public ObjectInit(){
		System.out.println("ObjectInit構造方法");
	}
	public static void main(String[] arg0){
		new B();
		System.out.println("----------------------------");
		new B();
	}
}
class A{
	//static ObjectInit oi = new ObjectInit();//此時,“ObjectInit
               //構造方法”輸出在"A static 程式碼塊"上邊
	static{
		System.out.println("A static 程式碼塊");
	}//只執行一次
	static ObjectInit oi = new ObjectInit();//此時,“ObjectInit構
           //造方法”輸出在"A static 程式碼塊"下邊
	protected String s = "先於父類程式碼塊宣告並初始化";
	{
		System.out.println("A 程式碼塊");
		System.out.println("A 例項變數s輸出:"+s);
	}//物件被建立幾次,執行幾次
	public A(){
		System.out.println("A 構造方法");
	}
}
class B extends A{
	static {
		System.out.println("B static 程式碼塊");
	}
	{
		System.out.println("B 程式碼塊");
	}
	public B(){
		System.out.println("B 構造方法");
	}
}
輸出結果:
A static 程式碼塊
ObjectInit構造方法
B static 程式碼塊
A 程式碼塊
A 例項變數s輸出:先於父類程式碼塊宣告並初始化
A 構造方法
B 程式碼塊
B 構造方法
----------------------------
A 程式碼塊
A 例項變數s輸出:先於父類程式碼塊宣告並初始化
A 構造方法
B 程式碼塊
B 構造方法

 

相關文章