繼承中的初始化問題

 本文章重點比較了一下含有static關鍵詞的繼承關係中的初始化順序問題,現在直接貼出需要的代碼:
public class Apple {
    static private int i = 0;//只初始化一次:只有第一次新建對象時會執行
    private int k;//每次都要進行初始化
    private String s;

    public Apple(){
        k++;
        i++;
        System.out.println("applei" + i);
        System.out.println("applek" + k);
        System.out.println(s);
    }

    {
        System.out.println("defeinds" + s);
        s = "kaka";
    }
    //這塊代碼只有第一次新建對象時會執行
    static{
        System.out.println("statici" + i);  
        i = 4;//只有第一次初始化,之後不起作用
    }
    public static int getI() {
        return i;
    }
    public static void setI(int i) {
        Apple.i = i;
    }   
}
public class Fruit extends Apple{
    private int f = 2;
    public Fruit(){
        System.out.println("Fruit" + f);
    }

    {
        System.out.println("Fruit defeind" + f);
        f++;
    }
}
public class AppleDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new Fruit();
        new Fruit();
    }
}
運行的結果:
statici0
defeindsnull
applei5
applek1
kaka
Fruit defeind2
Fruit3
defeindsnull
applei6
applek1
kaka
Fruit defeind2
Fruit3

現在寫出分析結果:
知識點一:
在初始化時,static修飾的變量會被優先初始化,若存在多個static變量則按static的出現順序初始化。
知識點二:
static變量只會在第一次創建對象的時候被初始化,之後創建的對象則不會再次對它進行初始化。
知識點三:
在調用構造器之前所有的初始化已經完成。
知識點四
在子類對象初始化前會先對父類進行初始化。
最終給出初始化順序:
超類的靜態成員(靜態塊)
子類的靜態成員(靜態塊)
超類的非靜態成員
超類的構造函數
子類的非靜態成員
子類的構造函數

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