Parent p = new Child();
Это создает экземпляр класса Child
. Это должно выполнить конструктор класса Child
. Но перед этим он запустит конструктор класса Parent
. Это установит значение counter
равным 1.
Далее, когда запускается конструктор дочернего класса, он печатает 1
.
Последняя часть тривиальна. При вызове System.out.print(p.counter);
печатается еще один 1
. Таким образом, результат будет 11
.
Сводка: Конструктор родительского класса будет выполнен до дочернего.
Кстати, ничего такого нет делать с апкастинг . Это наследство.