В настоящее время принятый ответ не отвечает на вопрос.Это объясняет, почему вы не можете получить доступ к элементу z
экземпляра A
из тела B
или C
.Но возникает вопрос, почему вы не можете получить доступ к члену z
экземпляра B
из C
.
Причина в том, что B
не является подклассом C
.Прочитайте спецификацию Java, раздел 6.6.2.1:
Пусть C будет классом, в котором объявлен защищенный член.Доступ разрешен только в теле подкласса S из C.
Кроме того, если Id обозначает поле экземпляра или метод экземпляра, то:
Если доступ осуществляется с помощьюквалифицированное имя Q.Id , где Q - ExpressionName, тогда доступ разрешен тогда и только тогда, когда тип выражения Q - S или подкласс S.
http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.2.1
(разметка)
Таким образом, в пределах B
вы можете сказать obj3.z
, потому что obj3
имеет тип C
и C
является подклассом B
.
Но в пределах C
вы не можете сказать obj2.z
, потому что obj2
имеет тип B
, а B
- , а не aподкласс C
.
Чтобы суммировать значение защищенного:
Предположим, что защищенный член объявлен в теле класса A
.
(1) Доступ к защищенному члену можно получить из любого места в пакете, содержащем A
.
(2) Кроме того, подкласс S
из A
, определенный в другомарендовать пакет, может получить доступ к защищенному члену в экземплярах S
или экземплярах классов, которые наследуются от S
, , но не в экземплярах классов, от которых S
наследует.
Последнее предложение является ключевым моментом, когда речь идет об ответе на этот вопрос.