Em que ordem os blocos estáticos e os blocos de inicialização são executados ao usar herança?

Eu tenho duas classes pai e filho

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

A saída do código acima será

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

Por que Java executa o código nessa ordem? Quais são as regras que determinam a ordem de execução?

questionAnswers(11)

yourAnswerToTheQuestion