Мне интересно, почему у Java такое странное поведение в отношении суперкласса и подкласса, имеющих переменные экземпляра с одинаковыми именами.
Допустим, у нас есть следующие определения классов:
class Parent {
int var = 1;
}
class Child extends Parent {
int var = 2;
}
Делая это, мы должны скрыть переменную суперкласса var
. И если мы не укажем явно способ доступа к var
Parent
через вызов super
, то мы никогда не сможем получить доступ к var
из экземпляра ребенка.
Но когда у нас есть приведение, этот механизм сокрытия ломается:
Child child = new Child();
Parent parent = (Parent)child;
System.out.println(parent.var); // prints out 1, instead of 2
Разве это не позволяет полностью обойти весь смысл сокрытия поля? Если это так, то разве это не делает идею совершенно бесполезной?
РЕДАКТИРОВАТЬ : Я имею в виду конкретно эту статью в Руководствах по Java. Он упоминает
Внутри подкласса поле в суперклассе не может ссылаться на по его простому имени. Вместо этого к полю необходимо получить доступ через super ...
Из того, что я там читал, похоже, подразумевается, что разработчики Java имели в виду какую-то технику, чтобы сделать это. Хотя я согласен с тем, что это довольно неясная концепция и, вероятно, будет плохой практикой в целом.