Что здесь происходит?
Вы неправильно поняли значение
protected
. Вы можете получить доступ к защищенным членам, объявленным вA
, изC
, но только для экземпляровC
или подклассовC
. Подробнее о защищенном доступе см. В разделе 6.6.2 раздела JLS . В частности:Пусть C - класс, в котором объявлен защищенный член. Доступ разрешен только внутри тела подкласса S из C.
Кроме того, если Id обозначает поле экземпляра или метод экземпляра, то:
- [... ]
- Если доступ осуществляется с помощью выражения доступа к полю E.Id, где E является первичным выражением или выражением вызова метода E.Id (...), где E является первичным выражением, то доступ разрешен тогда и только тогда, когда тип E является S или подклассом S.
(Emphasis mine.)
Итак этот код был бы точным:
C c = new C(); System.out.println(c.publicInt); System.out.println(c.protectedInt);