Приведите Child
к Parent
:
System.out.println(((Parent) c).i);
Почему это работает?
В экземпляре Child
есть два поля с именем i
, одно из Parent
class и one из Child
, и компилятор (не тип времени выполнения экземпляра) решает, какой из них будет использован.Компилятор делает это в зависимости от типа, который он видит.Итак, если компилятор знает, что это экземпляр Child
, он создаст метод доступа для поля Child
.Если он знает только, что это Parent
, вы получите доступ к полю Parent
.
Некоторые примеры:
Parent parent = new Parent();
Child child = new Child();
Parent childAsParent = child;
System.out.println(parent.i); // parent value
System.out.println(child.i); // child value
System.out.println(((Parent) child) .i); // parent value by inline cast
System.out.println(childAsParent.i); // parent value by broader variable type
Если компилятор знает, что это Child
, он даетдоступ к полю Child
, если вы заберете эти знания (путем приведения или сохранения в переменную Parent
), вы получите доступ к полю Parent
.
Это сбивает с толкуНе так ли? Это приглашение на всевозможные неприятные недоразумения и ошибки кодирования.Поэтому не рекомендуется использовать одно и то же имя поля в родительском и дочернем классах.