В каком порядке выполняются статические блоки и блоки инициализации при использовании наследования?

У меня два класса Parent и Child

public class Parent {    
    public Parent() {
        System.out.println("Parent Constructor");
    }    
    static {
        System.out.println("Parent static block");    
    }    
    {
        System.out.println("Parent initialisation  block");
    }
}

public class Child extends Parent {    
    {
        System.out.println("Child initialisation block");
    }
    static {
        System.out.println("Child static block");
    }

    public Child() {
        System.out.println("Child Constructor");
    }    
    public static void main(String[] args) {
        new Child();    
    }
}

Вывод приведенного выше кода будет

Parent static block
Child static block
Parent initialization  block
Parent Constructor
Child initialization block
Child Constructor

Почему Java выполняет код в таком порядке? Какие правила определяют порядок исполнения?

Ответы на вопрос(11)

Ваш ответ на вопрос