Доступ к частным переменным экземпляра parent из дочернего класса? - PullRequest
22 голосов
/ 05 мая 2009

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

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

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

Ответы [ 8 ]

26 голосов
/ 05 мая 2009

Нет, не в соответствии с спецификацией языка Java, 3-е издание :

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

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

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

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

String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);
21 голосов
/ 05 мая 2009

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

6 голосов
/ 05 мая 2009

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

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

1 голос
/ 29 апреля 2013

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

1 голос
/ 05 мая 2009

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

1 голос
/ 05 мая 2009

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

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

1 голос
/ 05 мая 2009

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

0 голосов
/ 09 апреля 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...