http://www.cnblogs.com/wenruo/articles/5349525.html
先不考慮父類。
當創建類對象時,先初始化靜態變量和靜態塊,然后是非靜態變量和非靜態代碼塊,然后是構造器。由於靜態成員只會被初始化一次,所以如果靜態成員已經被初始化過,將不會被再次初始化。
例如
1 class A { 2 A(int maker) { 3 System.out.println("A(" + maker + ")"); 4 } 5 } 6 7 class Test { 8 static A a1 = new A(1); 9 A a2 = new A(2); 10 { 11 System.out.println("非靜態的代碼塊"); 12 } 13 A a3 = new A(3); 14 static { 15 System.out.println("靜態塊"); 16 A a4 = new A(4); 17 } 18 static void f() {System.out.println("f()");} 19 Test() { 20 System.out.println("Test()"); 21 } 22 static A a5 = new A(5); 23 } 24 25 public class Initialize { 26 public static void main(String[] args) { 27 new Test(); 28 System.out.println(); 29 new Test(); 30 } 31 }
輸出為:
A(1) 靜態塊 A(4) A(5) A(2) 非靜態的代碼塊 A(3) Test() A(2) 非靜態的代碼塊 A(3) Test()
對於靜態成員,不僅是初始化對象時才會初始化,當第一次引用靜態變量或者靜態函數時都會使靜態成員初始化。
還是上面的代碼,小改一下:
1 class A { 2 A(int maker) { 3 System.out.println("A(" + maker + ")"); 4 } 5 } 6 7 class Test { 8 static A a1 = new A(1); 9 A a2 = new A(2); 10 { 11 System.out.println("非靜態的代碼塊"); 12 } 13 A a3 = new A(3); 14 static { 15 System.out.println("靜態塊"); 16 A a4 = new A(4); 17 } 18 static void f() {System.out.println("f()");} 19 Test() { 20 System.out.println("Test()"); 21 } 22 static A a5 = new A(5); 23 } 24 25 public class Initialize { 26 public static void main(String[] args) { 27 Test.f(); 28 System.out.println(); 29 new Test(); 30 } 31 }
這次將輸出:
A(1) 靜態塊 A(4) A(5) f() A(2) 非靜態的代碼塊 A(3) Test()
然后考慮下父類。
當子類的靜態域被初始化時候,那一定要先初始化父類的靜態域。
當創建子類對象時,要先初始化靜態域(如果之前未初始化),先是父類然后子類。之后初始化父類的非靜態域和父類構造器,然后是子類。
例(新手起名廢求破):
1 class XD { 2 XD(int maker) { 3 System.out.println("XD(" + maker +")"); 4 } 5 } 6 7 class Father { 8 Father() { 9 System.out.println("Father()"); 10 } 11 static XD xd = new XD(1); 12 XD xd1 = new XD(2); 13 } 14 15 class Son extends Father { 16 Son() { 17 System.out.println("Son()"); 18 } 19 static XD xd = new XD(3); 20 XD xd1 = new XD(4); 21 static void f() { System.out.println("f()"); } 22 } 23 24 25 public class InitializeWithExtends { 26 public static void main(String[] args) { 27 new Son(); 28 System.out.println(); 29 new Son(); 30 } 31 }
輸出
XD(1) XD(3) XD(2) Father() XD(4) Son() XD(2) Father() XD(4) Son()