Полиморфизм применяется к методам, а не к переменным экземпляра.
Обе строки 21 и 23 печатают значение переменных экземпляра класса A
, поскольку это тип времени компиляции o2
(даже если его тип времени выполнения равен B
).
21. System.out.println(o2.x);
Значение элемента A
x
равно 1
(устанавливается конструктором public A () { x=1; y=2; }
).
23. System.out.println(o2.y);
Значение A
элемента y
равно 4
(устанавливается конструктором public B () { super(); x=3; y=4; z=5; }
).
Обратите внимание, что B
имеет переменную экземпляра x
, которая скрывает переменную A
с тем же именем. Поэтому конструктор B
не меняет переменную A
x
на 3
. С другой стороны, B
не имеет переменной экземпляра y
, поэтому y=4;
изменяет значение переменной A
y
на 4
.
Кстати, в строке 20 есть ошибка компиляции. Я должен был закомментировать его, чтобы выполнить ваш код.
Также обратите внимание, что o2.getx()
дает результат, отличный от o2.x
, поскольку getx()
является методом, переопределенным классом B
, поэтому он возвращает переменную экземпляра B
x
, значение которой 3
(поскольку тип времени выполнения o2
равен B
).