Подтвердить что ты не робот

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

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

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

Я, кстати, работаю на Java.

4b9b3361

Ответ 1

Нет, не в соответствии со спецификацией java language, 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);

Ответ 2

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

Ответ 3

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

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

Ответ 4

В дочерних классах нет доступа к частным членам (что является целым элементом управления частным доступом).

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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