天天看点

初学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本身的静态初始化块.

继续阅读