Почему я могу переопределить защищенный метод с помощью общедоступного метода?
Компилятор Java не жалуется, когда я переопределяю метод protected
с помощью метода public
. Что на самом деле происходит здесь? Является ли это переопределением или скрытием родительского метода, поскольку родительский метод имеет более низкую видимость?
Ответы
Ответ 1
Подкласс может всегда расширять модификатор доступа, поскольку он по-прежнему является действительной заменой для суперкласса. Из спецификации Java о Требованиях в переопределении и скрытии:
Модификатор доступа (§6.6) метода переопределения или скрытия должен обеспечивать как минимум такой же доступ, как и переопределенный или скрытый метод, следующим образом:
- Если переопределенный или скрытый метод является общедоступным, то метод переопределения или скрытия должен быть общедоступным; в противном случае возникает ошибка времени компиляции.
- Если защищенный или скрытый метод защищен, то метод переопределения или скрытия должен быть защищен или общедоступен; в противном случае возникает ошибка времени компиляции.
- Если у переопределенного или скрытого метода есть доступ по умолчанию (пакет), то метод переопределения или скрытия не должен быть закрытым; в противном случае возникает ошибка времени компиляции.
Ответ 2
С точки зрения внешнего класса общедоступный метод - это просто новый метод, а не переопределяющий метод, так как внешний класс не мог получить доступ к защищенному методу.
С другой стороны, снижение видимости не допускается, потому что внешний класс всегда может использовать ссылку типа суперкласса для ссылки на объект подкласса и вызывать тот же метод.
Ответ 3
Видимость влияет только на внешнюю доступность. Будучи методом public
, любой внешний класс может вызвать его.
Уровень доступа метода переопределения не влияет на видимость исходного метода. После переопределения с любыми уровнями доступа исходный метод доступен только при вызове super
в подклассе.