前言:最近在面试题或者面试上老是提到静态块、构造块等执行顺序,这里总结一下
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
public class Main { public static void main(String[] args) { B b = new B(); b = new B(); } }
class A { static { System.out.println("静态构造块 A1"); }
static { System.out.println("静态构造块 A2"); }
{ System.out.println("构造块 A1"); }
{ System.out.println("构造块 A2"); }
public A() { System.out.println("构造函数 A"); } }
class B extends A { static { System.out.println("静态构造块 B1"); }
static { System.out.println("静态构造块 B2"); }
{ System.out.println("构造块 B1"); }
{ System.out.println("构造块 B2"); }
public B() { System.out.println("构造函数 B"); } }
|
结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 静态构造块 A1 静态构造块 A2 静态构造块 B1 静态构造块 B2 构造块 A1 构造块 A2 构造函数 A 构造块 B1 构造块 B2 构造函数 B 构造块 A1 构造块 A2 构造函数 A 构造块 B1 构造块 B2 构造函数 B
|
静态构造块:用static申明,JVM加载类时执行,仅执行一次
构造块:类中直接用{}定义,每一次创建对象时执行
静态块用于类初始化,构造块用于对象初始化。
静态代码块只会运行一次,一个类中可以有多个静态代码块,执行顺序按照位置决定。
执行顺序优先级:静态块>main()>构造块>构造方法
当设计继承时:
- 执行父类的静态代码块,并初始化父类静态成员变量
- 执行子类的静态代码块,并初始化子类静态成员变量
- 执行父类的构造代码块,执行父类的构造函数,并初始化父类普通成员变量
- 执行子类的构造代码块, 执行子类的构造函数,并初始化子类普通成员变量
变形
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
public class Main { public static void main(String[] args) { A a = new A(); a = new B(); } }
class A { static { System.out.println("静态构造块 A1"); }
static { System.out.println("静态构造块 A2"); }
{ System.out.println("构造块 A1"); }
{ System.out.println("构造块 A2"); }
public A() { System.out.println("构造函数 A"); } }
class B extends A { static { System.out.println("静态构造块 B1"); }
static { System.out.println("静态构造块 B2"); }
{ System.out.println("构造块 B1"); }
{ System.out.println("构造块 B2"); }
public B() { System.out.println("构造函数 B"); } }
|
结果
1 2 3 4 5 6 7 8 9 10 11 12 13
| 静态构造块 A1 静态构造块 A2 构造块 A1 构造块 A2 构造函数 A 静态构造块 B1 静态构造块 B2 构造块 A1 构造块 A2 构造函数 A 构造块 B1 构造块 B2 构造函数 B
|