it-roy-ru.com

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

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

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

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

21
lfaraone

Нет, не в соответствии с спецификацией языка 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);
24
Wim Coenen

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

21
RichieHindle

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

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

6
Sandro

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

1
Sushim Mukul Dutta

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

1
alphazero

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

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

1
ivmos

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

1
George Armhold

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

0
neeranzan