1. 程式人生 > >java靜態變數,靜態程式碼塊,普通程式碼塊,建構函式載入順序

java靜態變數,靜態程式碼塊,普通程式碼塊,建構函式載入順序

前言:

java成員變數和構造方法等載入順序是一個很基礎又很容易搞混的東西,今天寫下來算是更明確一些

正文:

廢話不多說上程式碼

 

public class Father {

    public Father(){
        System.out.println("載入父類建構函式");
    }


    public static String fatherStaicVar = "父類靜態變數";
    static {
        System.out.println("載入父類靜態程式碼塊");
        System.out.println("載入"+fatherStaicVar);
    }

    {
        System.out.println("載入父類普通程式碼塊");
    }

}
public class Son extends Father {

    public Son(){
        System.out.println("載入子類建構函式");
    }


    public static String sonStaicVar = "子類靜態變數";

    static {
        System.out.println("載入子類靜態程式碼塊");
        System.out.println("載入"+sonStaicVar);
    }

    {
        System.out.println("載入子類普通程式碼塊");
    }

    public static void main (String[] args){

        Father father = new Son();

    }
}
載入父類靜態程式碼塊
載入父類靜態變數
載入子類靜態程式碼塊
載入子類靜態變數
載入父類普通程式碼塊
載入父類建構函式
載入子類普通程式碼塊
載入子類建構函式

輸出結果表明,程式的執行順序為: 
如果類還沒有被載入: 
1、先執行父類的靜態程式碼塊和靜態變數初始化,並且靜態程式碼塊和靜態變數的執行順序只跟程式碼中出現的順序有關。 
2、執行子類的靜態程式碼塊和靜態變數初始化。 
3、執行父類的普通程式碼塊和例項變數初始化 
4、執行父類的建構函式 
5、執行子類的普通程式碼塊和例項變數初始化 
6、執行子類的建構函式 

另外如果類已經被載入

則靜態程式碼塊和靜態變數就不用重複執行,再建立類物件時,只執行與例項相關的變數初始化和構造方法。