開始記錄之前,我想先上一張圖片擦剑,這是書本上給出的代碼示例妖胀,不知道大家的第一感覺是什么,反正我第一次看到這段代碼的時候心情是挺復雜的抓于。由于當時的我對類初始化流程還不怎么熟悉做粤,所以根本無法想象代碼是如何運行的。
當然捉撮,如果知道了加載順序的話怕品,不管代碼多亂,得到運行結(jié)果也就不難了巾遭。
對照結(jié)果我們可以發(fā)現(xiàn)肉康,類初始化順序依次是:父類(靜態(tài)變量闯估、靜態(tài)初始化塊)>子類(靜態(tài)變量、靜態(tài)初始化塊)>父類(變量吼和、初始化塊)>父類構(gòu)造器>子類(變量涨薪、初始化塊)>子類構(gòu)造器。(變量和初始化塊按定義順序初始化)
為了驗證上面的結(jié)論炫乓,我從網(wǎng)上摘抄了一段代碼來運行一遍看看刚夺,我們先不考慮有繼承類的情況。
(代碼出處:http://www.cnblogs.com/jackyrong/archive/2008/08/12/1266161.html)
public class InitialOrderTest {
// 靜態(tài)變量
public static String staticField = "靜態(tài)變量";
// 變量
public String field = "變量";
// 靜態(tài)初始化塊
static {
System.out.println(staticField);
System.out.println("靜態(tài)初始化塊");
}
// 初始化塊
{
System.out.println(field);
System.out.println("初始化塊");
}
// 構(gòu)造器
public InitialOrderTest() {
System.out.println("構(gòu)造器");
}
public static void main(String[] args) {
new InitialOrderTest();
}
}
運行結(jié)果:
上圖證明我們的結(jié)論是正確的末捣。
下面我們來看看有繼承類的情況
class Parent {
// 靜態(tài)變量
public static String p_StaticField = "父類--靜態(tài)變量";
// 變量
public String p_Field = "父類--變量";
// 靜態(tài)初始化塊
static {
System.out.println(p_StaticField);
System.out.println("父類--靜態(tài)初始化塊");
}
// 初始化塊
{
System.out.println(p_Field);
System.out.println("父類--初始化塊");
}
// 構(gòu)造器
public Parent() {
System.out.println("父類--構(gòu)造器");
}
}
public class SubClass extends Parent {
// 靜態(tài)變量
public static String s_StaticField = "子類--靜態(tài)變量";
// 變量
public String s_Field = "子類--變量";
// 靜態(tài)初始化塊
static {
System.out.println(s_StaticField);
System.out.println("子類--靜態(tài)初始化塊");
}
// 初始化塊
{
System.out.println(s_Field);
System.out.println("子類--初始化塊");
}
// 構(gòu)造器
public SubClass() {
System.out.println("子類--構(gòu)造器");
}
// 程序入口
public static void main(String[] args) {
new SubClass();
}
}
運行結(jié)果:
父類--靜態(tài)變量
父類--靜態(tài)初始化塊
子類--靜態(tài)變量
子類--靜態(tài)初始化塊
父類--變量
父類--初始化塊
父類--構(gòu)造器
子類--變量
子類--初始化塊
子類--構(gòu)造器
至此侠姑,可以證明我們最初的結(jié)論是正確的。
按照這個結(jié)論箩做,我們可以回顧一下最開始那段代碼莽红,是否感覺沒那么復雜了呢。好了邦邦,今天的總結(jié)就先到這吧安吁。
如果有錯誤的地方歡迎批評指正。