静态块、自由块及构造函数的执行顺序

     静态块和静态变量在类的加载时被执行;加载子类时,会预先加载父类,因此父类中如果有静态块,则最先执行之,然后立即执行子类的静态块;
如果一个类中有多个静态块,则按照编码的先后顺序执行

 

注:因为一个类只会被加载一次,所以每个静态块只会执行一次

 

自由块格式(又称“普通块”):
{
     // statements;
}

自由块在类被实例化时执行

 

如果要实例化一个子类,那么它的构造函数会先实例化其父类。因此父类的自由块会先被执行,然后开始构造父类;父类的构造器执行完毕后,操作权返回给子类的构造器,此时开始执行子类的自由块,然后开始构造子类。

 

执行的顺序依次为:
父类静态块 → 子类静态块 → 父类自由块 → 父类构造函数 → 子类自由块 → 子类构造函数

 

/*
 * Output:
    A
    C
    B
    D
    E
 */

class ClassA {

    public ClassA() 
    {

        System.out.println("D");

    }

    {

        System.out.println("B");

    }

}

class Base extends ClassA {

    int i;

    public Base() 
    {

        i = 10;

        System.out.println("E");

    }

    static 
    {

        System.out.println("A");

    }

}

public class ClassB extends Base {

    public static void main(String[] args) {

        new ClassB();

    }

    static 
    {

        System.out.println("C");

    }

}
原文地址:https://www.cnblogs.com/bluestorm/p/2638705.html