1. public class Test
    2. {
    3. public static Test t1 = new Test(); //(1) 静态对象
    4. {
    5. System.out.println("blockA"); //(2) 非静态代码块
    6. }
    7. static
    8. {
    9. System.out.println("blockB"); //(3) 静态代码块
    10. }
    11. public static void main(String[] args)
    12. {
    13. Test t2 = new Test(); //(4)
    14. }
    15. }

    静态块:用static申明,JVM加载类时执行,仅执行一次
    构造块:类中直接用{}定义,每一次创建对象时执行
    执行顺序优先级:静态块>main()>构造块>构造方法

    类的加载顺序

    1. 父类静态对象和静态代码块
    2. 子类静态对象和静态代码块
    3. 父类非静态对象和非静态代码块
    4. 父类构造函数
    5. 子类非静态对象和非静态代码块
    6. 子类构造函数

    在执行(1)时创建了一个Test对象,在这个过程中会执行非静态代码块(2)和缺省的无参构造函数,在执行非静态代码块时就输出了blockA;
    然后执行(3)输出blockB;
    执行(4)的过程同样会执行非静态代码块和缺省的无参构造函数,在执行非静态代码块时输出blockA。
    因此,最终的结果为
    blockA
    blockB
    blockA