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