java類初始化順序


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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM