Java中static块、构造块、构造函数的执行顺序

最近被一个面试题难住了,看来之前对JAVA的执行顺序欠了解。以为原面试题代码:

public class Example {
    public static void main(String[] args) {

        HelloB bb = new HelloB();
    }
}

class HelloA {
    public HelloA() {
        System.out.println("HelloA");
    }

    {
        System.out.println("I'm A class");
    }
    static {
        System.out.println("static A");
    }
}

class HelloB extends HelloA {
    public HelloB() {
        System.out.println("HelloB");
    }

    {
        System.out.println("I'm B class");
    }
    static {
        System.out.println("static B");
    }

    public static void main(String[] args) {
        new HelloB();
    }
}
View Code

执行结果是:

static A
static B
I'm A class
HelloA
I'm B class
HelloB

得出以下总结:
1. 当调用JAVA子类的无参构造函数时,虽然子类无参构造函数没有显式调用其父类的无参构造函数,但是Java会自动调用其父类的无参构造器 (注:有参构造函数需要显式调用)
2. JAVA的执行顺序是:父类静态块 -> 子类静态块 -> 父类构造块 -> 父类构造函数 -> 子类构造块 -> 子类构造函数