天天看點

初學Java,初始化塊(十三)

初始化塊是什麼?在Java中就是在構造器之前執行的一段代碼,它的用處是,如果一段初始化處理代碼對所有對象完全相同,且無須接受任何參數,就可以把這段提取到初始化塊中.在C#中,沒有初始化塊

1. public class  Person  
2. {  
3. //定義一個初始化塊  
4.     {  
5. int a = 6;  
6. //在初始化塊中  
7. if (a >4)  
8.         {  
9. "Person 初始化塊:局部變量a的值大于4");  
10.         }  
11.     }  
12. //定義第二個初始化塊  
13.     {  
14. "Person的第二個初始化塊");  
15.     }  
16. //定義無參數的構造器  
17. public Person()  
18.     {  
19. "Person的無參數構造器");  
20.     }  
21. public static void main(String[] args)   
22.     {  
23. new Person();  
24.     }  
25. }      

輸出

Person 初始化塊:局部變量a的值大于4

Person的第二個初始化塊

Person的無參數構造器

初始化塊的執行順序是按定義的順序執行,最後才輪到構造器

初始化塊又分為非靜态初使化塊和靜态初始化塊,靜态初始化塊必須要用static進行修飾,靜态初始化塊是對類而言,非靜态初始化塊是對對象而言,但靜态初始化塊的執行順序在前,非靜态在後.

1. public class Root  
2. {  
3. static{  
4. "Root 的靜态初始化塊");  
5.     }  
6.     {  
7. "Root 的普通初始化塊");  
8.     }  
9. public Root()  
10.     {  
11. "Root 的無參數的構造器");  
12.     }  
13. }  
14.   
15. public class Mid extends Root  
16. {  
17. static{  
18. "Mid 的靜态初始化塊");  
19.     }  
20. public Mid()  
21.     {  
22. "Mid 的無參數的構造器");  
23.     }  
24. public Mid(String msg)  
25.     {  
26. //通過this調用同一類中重載的構造器  
27. this();  
28. "Mid的帶參構造器,其參數值:" + msg);  
29.     }  
30. }  
31.   
32. public class Leaf extends Mid  
33. {  
34. static{  
35. "Leaf 的靜态初始化塊");  
36.     }  
37.     {  
38. "Leaf 的普通初始化塊");  
39.     }  
40. public Leaf()  
41.     {  
42. //通過surper 調用父類中有一個字元串參數的構造器  
43. super("Struts 2權威指南");  
44. "執行Leaf的構造器");  
45.     }  
46. }  
47.   
48. public class Test  
49. {  
50. public static void main(String[] args)  
51.     {  
52. new Leaf();  
53. new Leaf();  
54.     }  
55. }      

從上面的執行結果可以看出,類初始化階段,先執行最頂層父類的靜态初始化塊,依次向下,最後執行目前類靜态初始化塊,對象初始化階段,先執行最頂層父類的初始化塊,構造器,依次向下,最後執行目前類初始化塊,構造器

分析上面的例子,主程式兩次執行new Leaf(); ,建立2個Leaf對象,第一次建立Leaf對象時,系統中還不存在Leaf類,是以需要先加載并初始化Leaf類,初始化Leaf類時會先執行其頂層父類的靜态初始化塊,最後才執行Leaf本身的靜态初始化塊.

繼續閱讀