看java編程思想時有個練習:建立一個類,它包含一個在定義時就被初始化了的String域,以及另外一個經過構造器初始化的String域。這兩種方式有何差別。我的感受應該是問初始化順序吧。測試了下,是定義時初始化在構造器初始化前完成。 java
想到這裏乾脆把靜態變量、靜態初始化塊、變量、初始化塊、構造器這五個都測試下,如下是測試代碼 c++
/**測試類初始化順序 * * @author IM絕影 * @create 2014-5-8 */ public class InitTest { //靜態變量 public static String st = "靜態變量"; //變量 public String s = "變量"; //靜態塊 static { System.out.println("靜態塊內:"+st); // 下面這句編譯錯誤,說明靜態塊前變量還沒初始化 // System.out.println(s); System.out.println("靜態塊"); } //初始化塊 { // System.out.println("初始化塊:"+st); System.out.println("初始化塊:"+s); System.out.println("初始化塊"); } //構造函數 public InitTest(){ System.out.println("構造方法內"); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub new InitTest(); } }
下面是輸出結果: 編程
靜態塊內:靜態變量
原來在學c++時有寫過繼承類的初始化順序,正好也測試下,如下是父類和繼承類中初始化順序測試代碼: 函數
/**測試繼承類初始化順序 * * @author IM絕影 * @create 2014-5-8 */ class Parent { //靜態變量 public static String st = "父類--靜態變量"; //變量 public String s = "父類--變量"; //靜態塊 static { System.out.println("父類--靜態塊內:"+st); System.out.println("父類--靜態塊"); } //初始化塊 { System.out.println("父類--初始化塊:"+s); System.out.println("父類--初始化塊"); } //構造函數 public Parent(){ System.out.println("父類--構造方法內"); } } public class SubClass extends Parent { //靜態變量 public static String st = "子類--靜態變量"; //變量 public String s = "子類--變量"; //靜態塊 static { System.out.println("子類--靜態塊內:"+st); System.out.println("子類--靜態塊"); } //初始化塊 { System.out.println("子類--初始化塊:"+s); System.out.println("子類--初始化塊"); } //構造函數 public SubClass(){ System.out.println("子類--構造方法內"); } public static void main(String[] args) { new SubClass(); } }
父類--靜態塊內:父類--靜態變量
父類--靜態塊
子類--靜態塊內:子類--靜態變量
子類--靜態塊
父類--初始化塊:父類--變量
父類--初始化塊
父類--構造方法內
子類--初始化塊:子類--變量
子類--初始化塊
子類--構造方法內
測試
能夠看到在父類完成靜態塊初始後子類也直接就開始靜態變量和靜態塊的初始。而初始化塊和構造都是在父類完成初始化後,子類纔開始進行初始化。 spa