|
Java初始化順序 1 無繼承情況下的Java初始化順序: class Sample { Sample(String s) { System.out.println(s); } Sample() { System.out.println("Sample默認構(gòu)造函數(shù)被調(diào)用"); } } class Test{ static Sample sam=new Sample("靜態(tài)成員sam初始化"); Sample sam1=new Sample("sam1成員初始化"); static{ System.out.println("static塊執(zhí)行"); if(sam==null)System.out.println("sam is null"); sam=new Sample("靜態(tài)塊內(nèi)初始化sam成員變量"); } Test() { System.out.println("Test默認構(gòu)造函數(shù)被調(diào)用"); } } //主函數(shù) public static void main(String str[]) { Test a=new Test(); } 輸出結(jié)果為: 靜態(tài)成員sam初始化 -----靜態(tài)成員初始化 static塊執(zhí)行 -----靜態(tài)塊被執(zhí)行 靜態(tài)塊內(nèi)初始化sam成員變量 ----靜態(tài)塊執(zhí)行 sam1成員初始化 -----普通成員初始化 Test默認構(gòu)造函數(shù)被調(diào)用 -----構(gòu)造函數(shù)執(zhí)行 由此可以得出結(jié)論: a 靜態(tài)成員變量首先初始化(注意,Static可以看做一個靜態(tài)成員,其執(zhí)行順序和其在類中申明的順序有關(guān)) b 普通成員初始化 c 執(zhí)行構(gòu)造函數(shù)。 對于靜態(tài)成員(static塊可以看成普通的一個靜態(tài)成員,其并不一定在類初始化時首先執(zhí)行)和普通成員,其初始化順序只與其在類定義中的順序有關(guān),和其他因素無關(guān)。 例如下面的例子: class Test{ static{ System.out.println("static 塊 1 執(zhí)行"); } static Sample staticSam1=new Sample("靜態(tài)成員staticSam1初始化"); Sample sam1=new Sample("sam1成員初始化"); static Sample staticSam2=new Sample("靜態(tài)成員staticSam2初始化"); static{ System.out.println("static 塊 2 執(zhí)行"); } Test() { System.out.println("Test默認構(gòu)造函數(shù)被調(diào)用"); } Sample sam2=new Sample("sam2成員初始化"); } 則結(jié)果為: static 塊 1 執(zhí)行 靜態(tài)成員staticSam1初始化 靜態(tài)成員staticSam2初始化 static 塊 2 執(zhí)行 --------靜態(tài)成員 sam1成員初始化 sam2成員初始化 --------普通成員 Test默認構(gòu)造函數(shù)被調(diào)用 --------構(gòu)造函數(shù) 2 Java繼承情況下的初始化順序: class Test{ static{ System.out.println("父類static 塊 1 執(zhí)行"); } static Sample staticSam1=new Sample("父類 靜態(tài)成員staticSam1初始化"); Sample sam1=new Sample("父類 sam1成員初始化"); static Sample staticSam2=new Sample("父類 靜態(tài)成員staticSam2初始化"); static{ System.out.println("父類 static 塊 2 執(zhí)行"); } Test() { System.out.println("父類 Test默認構(gòu)造函數(shù)被調(diào)用"); } Sample sam2=new Sample("父類 sam2成員初始化"); } class TestSub extends Test { static Sample staticSamSub=new Sample("子類 靜態(tài)成員staticSamSub初始化"); TestSub() { System.out.println("子類 TestSub 默認構(gòu)造函數(shù)被調(diào)用"); } Sample sam1=new Sample("子類 sam1成員初始化"); static Sample staticSamSub1=new Sample("子類 靜態(tài)成員staticSamSub1初始化"); static{System.out.println("子類 static 塊 執(zhí)行");} Sample sam2=new Sample("子類 sam2成員初始化"); } 執(zhí)行結(jié)果: 父類 static 塊 1 執(zhí)行 父類 靜態(tài)成員staticSam1初始化 父類 靜態(tài)成員staticSam2初始化 父類 static 塊 2 執(zhí)行 --------父類靜態(tài)成員初始化 子類 靜態(tài)成員staticSamSub初始化 子類 靜態(tài)成員staticSamSub1初始化 子類 static 塊 執(zhí)行 -------子類靜態(tài)成員初始化 父類 sam1成員初始化 父類 sam2成員初始化 父類 Test默認構(gòu)造函數(shù)被調(diào)用 -------父類普通成員初始化和構(gòu)造函數(shù)執(zhí)行 子類 sam1成員初始化 子類 sam2成員初始化 子類 TestSub 默認構(gòu)造函數(shù)被調(diào)用 -------父類普通成員初始化和構(gòu)造函數(shù)執(zhí)行 由此得出Java初始化順序結(jié)論: 1 繼承體系的所有靜態(tài)成員初始化(先父類,后子類) 2 父類初始化完成(普通成員的初始化-->構(gòu)造函數(shù)的調(diào)用) 3 子類初始化(普通成員-->構(gòu)造函數(shù)) Java初始化順序如圖: http://blog.csdn.net/macheng365/article/details/6403050 java初始化之二
|
|
|