Скрытие переменных экземпляра класса

Мне интересно, почему у 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 имели в виду какую-то технику, чтобы сделать это. Хотя я согласен с тем, что это довольно неясная концепция и, вероятно, будет плохой практикой в ​​целом.

15
задан Charles 18 October 2011 в 05:07
поделиться