Создается весь объект (т. Е. Дочерняя и родительская структура), затем конструкторы вызываются в порядке «родитель-потомок».
Если конструктор родителя вызывает метод, который переопределяется вдочерний класс, вызывается метод дочернего класса (следуя переопределяющей семантике);нет ничего особенного в том, чтобы быть в конструкторе.
Обратите внимание, что очень плохая идея вызывать неконечный метод в конструкторе (это один из пунктов в Джошуа Блохе«Эффективная Java») именно по этой причине: дочерний метод, переопределяющий его, может получить доступ к дочерним полям, которые еще не были инициализированы.
например,
class Parent {
Parent() {
method();
}
void method() { System.out.println(); }
}
class Child extends Parent {
String output = "hello";
void method() { if (output.equals("hello")) System.out.println(output); }
}
Конструктор Parent
будетВызывается до инициализации output
(из-за инициализации суперкласса), поэтому переопределение method
приведет к NullPointerException
.