Доступ к частным переменным экземпляра parent из дочернего класса?

StackOverflow https://stackoverflow.com/questions/822648

Вопрос

Допустим, у нас есть класс foo , который имеет личную переменную экземпляра bar .

Теперь давайте создадим другой класс, baz , который расширяет foo . Могут ли нестатические методы в baz обращаться к переменной foo bar , если в foo не определен метод доступа ?

Кстати, я работаю на Java.

Это было полезно?

Решение

Нет, не в соответствии с языком Java спецификация, третье издание :

  

6.6.8 Пример: частные поля, методы и конструкторы

     

Частный   член класса или конструктор   доступны только в теле   класс верхнего уровня (& # 167; 7.6), который включает   заявление члена или   конструктор. Не наследуется   подклассы.

Но независимо от этого языкового ограничения, вы можете доступ к закрытым полям с помощью отражения :

Field privateStringField = 
   MyClass.class.getDeclaredField("privateString");
privateStringField.setAccessible(true);

String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);

Другие советы

Нет, для этого вы должны использовать protected.

Для подобных вопросов, где на сайте есть таблица: http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

По сути, вы хотите, чтобы открытая или защищенная переменная объявлялась в foo, поскольку это переменные, которые подклассы наследуют от своего родителя и, следовательно, видны в baz.

Дочерние классы не могут получить доступ к закрытым членам (что и является целью контроля частного доступа).

... если в foo не определен метод доступа?

Вам нужны средства доступа. Кроме того, позаботься о наследовании. Должен ли этот var действительно быть в родительском? Помните, проверка IS-A ..

Вы не можете получить доступ к закрытым переменным в классах потомков. Обычно вы хотите использовать " защищенный " или "пакет" (по умолчанию) уровень доступа для этого. Однако, если вы хотите быть по-настоящему хитрым, вы можете прибегнуть к использованию отражения и AccessibleObject , чтобы добраться до него. Я бы не рекомендовал делать это для производственного кода, если вы действительно не связаны; для тестирования и т. д. это нормально.

Чтобы использовать закрытую переменную суперкласса в подклассе, требуется метод доступа. Еще используйте защищенный модификатор вместо частного.

Закрытая переменная (и) класса неизменно имеет область видимости внутри этого класса. Если он должен быть общим для подклассов, он должен быть объявлен «защищенным»

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top