初期化のタイミングについて

変数の初期化タイミングについても、みんな当たり前のように知っていると思うけど、非短絡論理演算子のように度忘れしたり、たまに疑問になったりしませんか。

ということで、ちょっと動かしてみました。

class Parent{
    {System.out.println("parent1 ");}
    public Parent(){System.out.println("parent2 ");}
}

class Child extends Parent{
    static {System.out.println("child1");}
    public Child(){System.out.println("child2 ");}
    {System.out.println("child3 ");}
    static {System.out.println("child4");}
}

class GrandChild extends Child{
    public static void main(String[] args){
        System.out.println("grandchild1 ");
        new GrandChild();
        System.out.println("grandchild2 ");
    }
}

実行結果

child1
child4
grandchild1
parent1
parent2
child3
child2
grandchild2 

静的初期化 > インスタンス初期化 > コンストラクタ という順で初期化されましたね。
特に新たな発見があったわけではなく、なんというか普通でした。