¿En qué orden se ejecutan los bloques estáticos y los bloques de inicialización cuando se usa la herencia?

Tengo dos clases padre e hijo

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

La salida del código anterior será

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

¿Por qué Java ejecuta el código en ese orden? ¿Cuáles son las reglas que determinan el orden de ejecución?

Respuestas a la pregunta(11)

Su respuesta a la pregunta