Доступ к частным переменным экземпляра родителя из дочернего класса?
Скажем, у нас есть класс foo
, который имеет переменную частного экземпляра bar
.
Теперь давайте еще один класс, baz
, который extends foo
. Могут ли нестатические методы в baz
получить доступ foo
variable bar
, если нет метода доступа, определенного в foo
?
Я, кстати, работаю на Java.
Ответы
Ответ 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
Частная переменная класса неизменно имеет область видимости внутри этого класса. Если он должен быть разделен между подклассами, он должен быть объявлен "защищенным"