1.初始化块
初始化块根据是否使用static修饰分为两类:
(1)不使用static修饰的是初始化块
(2)使用static修饰的是静态初始化块
•初始化块
◦初始化块相当于是对构造器的补充,用于创建对象时给对象的初始化,在构造器之前执行
◦如果一段初始化代码对所有构造器完全相同,且无需接收参数,那就可以将其提取到非静态初始化代码块中
◦实际上,经过编译后,非静态块已经添加到构造器中,且位于所有构造器代码的前面
•静态初始化块
◦静态初始化块用static修饰,又叫类初始化块
◦静态初始化块负责对类进行初始化,因此类初始化块是在类初始化阶段就执行
◦静态块跟静态方法一样,不能访问非静态成员
◦因为静态块是在类的初始化阶段完成的,因此在创建某个类的第二个对象时,该类的静态块就不会执行了
一、单个类中初始化块、静态初始化块、构造器的执行顺序
•在单个类中,静态初始化块(多个时从上往下执行),初始化块(多个时从上往下执行),构造器
class ClassDemo1{
2. public ClassDemo1() {
3. System.out.println("ClassDemo1构造器");
4. }
5.
6. {
7. System.out.println("ClassDemo1 初始化块1");
8. }
9. {
10. System.out.println("ClassDemo1 初始化块2");
11. }
12. {
13. System.out.println("ClassDemo1 初始化块3");
14. }
15.
16. static {
17. System.out.println("ClassDemo1 静态初始化块1");
18. }
19.
20. static {
21. System.out.println("ClassDemo1 静态初始化块2");
22. }
23.}
24.
25.public class Demo1 {
26. public static void main(String[] args) {
27. ClassDemo1 cDemo1=new ClassDemo1();
28. }
29.}
二、多个类的继承中初始化块、静态初始化块、构造器的执行顺序
•在继承中,先后执行父类A的静态块,父类B的静态块,最后子类的静态块,然后再执行父类A的非静态块和构造器,然后是B类的非静态块和构造器,最后执行子类的非静态块和构造器
(1)父类静态成员和静态初始化快,按在代码中出现的顺序依次执行。
(2)子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
(3) 父类的实例成员和实例初始化块,按在代码中出现的顺序依次执行。
(4)执行父类的构造方法。
(5)子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。
(6)执行子类的构造方法。
//----BaseOne.java
2.public class BaseOne {
3. static {
4. System.out.println("BaseOne静态初始化块");
5. }
6.
7. {
8. System.out.println("BaseOne初始化块");
9. }
10.
11. public BaseOne(){
12. System.out.println("BaseOne构造器");
13. }
14.}
15.
16.//----BaseTwo.java
17.public class BaseTwo extends BaseOne {
18. static {
19. System.out.println("BaseTwo静态初始化块");
20. }
21.
22. {
23. System.out.println("BaseTwo初始化块");
24. }
25.
26. public BaseTwo(){
27. System.out.println("BaseTwo构造器");
28. }
29.}
30.
31.//---- BaseThree.java
32.public class BaseThree extends BaseTwo {
33. static {
34. System.out.println("BaseThree静态初始化块");
35. }
36.
37. {
38. System.out.println("BaseThree初始化块");
39. }
40.
41. public BaseThree(){
42. System.out.println("BaseThree构造器");
43. }
44.}
45.
46.//----Demo2.java
47.public class Demo2 {
48. public static void main(String[] args) {
49. BaseThree baseThree=new BaseThree();
50. System.out.println("-->第二次创建BaseThree对象<--");
51. BaseThree baseThree2=new BaseThree();
52. }
53.}