1. 程式人生 > >java成員變數,靜態成員變數,靜態程式碼塊,程式碼塊和建構函式等載入順序

java成員變數,靜態成員變數,靜態程式碼塊,程式碼塊和建構函式等載入順序

直接上例子

父類:

/**
 * DESC: 父類 <br/>
 * USER: haiboz <br/>
 * DATE: 2018/1/29 17:01 <br/>
 */
public class Parent {
    private static String strParSta = "父類靜態成員變數";
    private String strParIns = "父類成員變數";
    static{
        System.out.println("進入父類靜態塊");
        System.out.println("strPar:"+strParSta);
    }
    public Parent(){
        System.out.println("進入父類建構函式");
        System.out.println("父類建構函式 strPar:"+strParSta);
        System.out.println("父類建構函式 strParIns:"+strParIns);
    }
    {
        System.out.println("進入父類程式碼塊");
        System.out.println("父類程式碼塊 strParIns:"+strParIns);
    }
    public void sout(){
        System.out.println("輸出");
    }

}
子類:
/**
 * DESC: 子類 <br/>
 * USER: haiboz <br/>
 * DATE: 2018/1/29 17:09 <br/>
 */
public class Son extends Parent {
    static String strSon = "子類靜態成員變數";
    String strSonIns = "子類成員變數";
    public Son() {
        System.out.println("進入子類建構函式");
        System.out.println("子類建構函式 strSon:"+strSon);
        System.out.println("子類建構函式 strSonIns:"+strSonIns);
    }
    static {
        System.out.println("進入子類靜態程式碼塊");
        System.out.println("子類靜態程式碼塊 strSon:"+strSon);
    }
    {
        System.out.println("進入子類程式碼塊");
        System.out.println("子類程式碼塊 strSonIns:"+strSonIns);
    }

    public static void main(String[] args) {
        Parent son = new Son();
        son.sout();
    }
}
執行輸出結果:
進入父類靜態塊
strPar:父類靜態成員變數
進入子類靜態程式碼塊
子類靜態程式碼塊 strSon:子類靜態成員變數
進入父類程式碼塊
父類程式碼塊 strParIns:父類成員變數
進入父類建構函式
父類建構函式 strPar:父類靜態成員變數
父類建構函式 strParIns:父類成員變數
進入子類程式碼塊
子類程式碼塊 strSonIns:子類成員變數
進入子類建構函式
子類建構函式 strSon:子類靜態成員變數
子類建構函式 strSonIns:子類成員變數
輸出
總結載入順序如下:

1.進入父類靜態程式碼塊

2.進入子類靜態程式碼塊

3.進入父類程式碼塊

4.進入父類建構函式

5.進入子類程式碼塊

6.進入子類建構函式

7.進入普通函式

其中步驟1-2為類載入過程,步驟3-6為物件例項化的過程。

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