W jakiej kolejności wykonywane są bloki statyczne i bloki inicjalizacyjne podczas korzystania z dziedziczenia?

Mam dwie klasy rodziców i dzieci

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();    
    }
}

Wyjście powyższego kodu będzie

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

Dlaczego Java wykonuje kod w tej kolejności? Jakie są reguły określające kolejność wykonywania?

questionAnswers(11)

yourAnswerToTheQuestion