Не могу определить порядок выполнения кода

У меня есть следующий код.

class X {
    X(){
        super();
        System.out.println("X()");
    }
}

class Y extends X {
    Y(){
        super();
        System.out.println("Y()");
    }
}

class Z extends Y {
    Z(){
        super();
        System.out.println("Z()");
    }

    public static void main(String args[]){

        Z z1 = new Z();
    }
}

И я получаю вывод

X()
Y()
Z()

Все хорошо. Так и должно быть. И когда я создаю статический объект X() в классе Z следующим образом

class X {
    X(){
        super();
        System.out.println("X()");
    }
}

class Y extends X {
    Y(){
        super();
        System.out.println("Y()");
    }
}

class Z extends Y {
    static X x1 = new X();
    Z(){
        super();
        System.out.println("Z()");
    }   

    public static void main(String args[]){

        Z z1 = new Z();
    }
}

X()
X()
Y()
Z()

Вывод в порядке, потому что статические экземпляры сначала загружаются в ОЗУ. Но когда я создаю экземпляр статического объекта, подобный этому

X x1 = new X();

Я получаю следующий вывод

X()
Y()
X()
Z()

Что меня действительно смущает. Что касается моих знаний, я должен получить следующий вывод

X()
Y()
Z()
X()

Сначала будет создан объект Z, а в последнюю очередь должен быть создан объект X. В этом случае он создается на третьем. Почему это? Есть ли здесь какая-то особая концепция?


person Shamal Sandeep    schedule 21.05.2015    source источник
comment
X x1 = new X(); это уже не статично, верно?   -  person Soumitri Pattnaik    schedule 21.05.2015
comment
@SoumitriPattnaik Да, но я хочу знать, почему объект экземпляра выполняется на третьем? вместо последнего?   -  person Shamal Sandeep    schedule 21.05.2015
comment
Он инициализируется перед вызовом конструктора Z.   -  person Bubletan    schedule 21.05.2015
comment
В связанном ответе вы можете видеть, что шаг 4 (запуск инициализаторов переменных экземпляра) выполняется после вызова суперконструктора и перед запуском остальной части конструктора.   -  person Louis Wasserman    schedule 21.05.2015