Почему я могу переопределить защищенный метод с помощью общедоступного метода?

Компилятор Java не жалуется, когда я переопределяю метод protected с помощью метода public. Что на самом деле происходит здесь? Является ли это переопределением или скрытием родительского метода, поскольку родительский метод имеет более низкую видимость?

Ответы

Ответ 1

Подкласс может всегда расширять модификатор доступа, поскольку он по-прежнему является действительной заменой для суперкласса. Из спецификации Java о Требованиях в переопределении и скрытии:

Модификатор доступа (§6.6) метода переопределения или скрытия должен обеспечивать как минимум такой же доступ, как и переопределенный или скрытый метод, следующим образом:

  • Если переопределенный или скрытый метод является общедоступным, то метод переопределения или скрытия должен быть общедоступным; в противном случае возникает ошибка времени компиляции.
  • Если защищенный или скрытый метод защищен, то метод переопределения или скрытия должен быть защищен или общедоступен; в противном случае возникает ошибка времени компиляции.
  • Если у переопределенного или скрытого метода есть доступ по умолчанию (пакет), то метод переопределения или скрытия не должен быть закрытым; в противном случае возникает ошибка времени компиляции.

Ответ 2

С точки зрения внешнего класса общедоступный метод - это просто новый метод, а не переопределяющий метод, так как внешний класс не мог получить доступ к защищенному методу.

С другой стороны, снижение видимости не допускается, потому что внешний класс всегда может использовать ссылку типа суперкласса для ссылки на объект подкласса и вызывать тот же метод.

Ответ 3

Видимость влияет только на внешнюю доступность. Будучи методом public, любой внешний класс может вызвать его.

Уровень доступа метода переопределения не влияет на видимость исходного метода. После переопределения с любыми уровнями доступа исходный метод доступен только при вызове super в подклассе.