public class Test{public static Test t1 = new Test(); //(1) 静态对象{System.out.println("blockA"); //(2) 非静态代码块}static{System.out.println("blockB"); //(3) 静态代码块}public static void main(String[] args){Test t2 = new Test(); //(4)}}
静态块:用static申明,JVM加载类时执行,仅执行一次
构造块:类中直接用{}定义,每一次创建对象时执行
执行顺序优先级:静态块>main()>构造块>构造方法
类的加载顺序
- 父类静态对象和静态代码块
- 子类静态对象和静态代码块
- 父类非静态对象和非静态代码块
- 父类构造函数
- 子类非静态对象和非静态代码块
- 子类构造函数
在执行(1)时创建了一个Test对象,在这个过程中会执行非静态代码块(2)和缺省的无参构造函数,在执行非静态代码块时就输出了blockA;
然后执行(3)输出blockB;
执行(4)的过程同样会执行非静态代码块和缺省的无参构造函数,在执行非静态代码块时输出blockA。
因此,最终的结果为
blockA
blockB
blockA
