本文章重點比較了一下含有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變量只會在第一次創建對象的時候被初始化,之後創建的對象則不會再次對它進行初始化。
知識點三:
在調用構造器之前所有的初始化已經完成。
知識點四
在子類對象初始化前會先對父類進行初始化。
最終給出初始化順序:
超類的靜態成員(靜態塊)
子類的靜態成員(靜態塊)
超類的非靜態成員
超類的構造函數
子類的非靜態成員
子類的構造函數