Порядок строительства объекта:
- объявление и инициализация переменной
- блок конструктора экземпляра
- Конструктор
Если у класса есть родительский класс, такой же порядок выполняется для родительского до того, как для фактического класса .
родитель первый
int num = 9
оценивается первым, num
устанавливается на 9 (родительский 1.)
Код родительского конструктора ... 9
Блоки инициализатора экземпляра выполняются перед конструктором (родительским 2).
Запуск родительского конструктора
Конструктор называется (родительский 3.)
Детское шоу ... 0
Конструктор Parent
вызывает show()
. show()
переопределяется, поэтому вызывается Child
.
Дочерние номера 1. и 2. еще не были вызваны, поэтому переопределение num
в Child
по-прежнему равно 0. * 1
потом ребенок
int num = 8
Child
х 1. оценивается
Код дочернего конструктора ... 8
Child
s 2. num
устанавливается на 10 после этого.
Выполнение дочернего конструктора
Child
х 3.
Детское шоу ... 10
Конструктор
Child
вызывает show()
.
* 1
Вот почему вызов не-1088 * методов в конструкторе очень опасен. Методы имеют тенденцию полагаться на инициализируемую переменную-член; их нет в этом месте.
Если бы это была не примитивная переменная, вы вполне могли бы столкнуться с NullPointerException
, если ваш метод пытается получить к ней доступ.