Получить доступ

Что верно про полиморфизм в Java?

MiddleООП
Коротко

Динамически (по реальному классу объекта) выбираются только переопределённые методы экземпляра. Статические методы скрываются, а не переопределяются: вызов определяется объявленным типом ссылки. Поля не полиморфны — тоже по объявленному типу.

  • Приватные и final-методы не переопределяются
  • Перегрузка выбирается на компиляции — не полиморфизм подтипов
  • JIT убирает виртуальный вызов, если реализация одна (девиртуализация)

А ещё Parent p = new Child(); p.staticMethod() — вызовет метод Parent

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Полиморфизм подтипов работает через таблицу виртуальных методов и потому применим лишь к методам экземпляра. Статический метод с той же сигнатурой в подклассе не переопределяет родительский, а скрывает его: какой вызовется, определяет объявленный тип ссылки — отсюда классический вопрос-ловушка на собеседовании. Поля ведут себя так же: у подкласса и суперкласса может быть по полю с одним именем, и выбор идёт по типу ссылки, а не объекта. Перегрузка к полиморфизму подтипов отношения не имеет — это выбор метода по типам аргументов на этапе компиляции, иногда его называют ad hoc полиморфизмом. Практический вывод: скрывать статические методы и поля не стоит — код становится непредсказуемым для читателя.

Что хотят услышать

  • Что диспетчеризуется динамически.
  • Скрытие статических методов и полей.

Частые ошибки

  • Ожидать от статических методов полиморфного поведения.
  • Смешивать переопределение и перегрузку в одном ответе.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Переопределённый метод выбирается в рантайме по фактическому классу объекта
  • ✓Статические методы не переопределяются, а скрываются: вызов разрешается по типу ссылки на этапе компиляции
  • ✓Обращение к полю не полиморфно — поле выбирается по объявленному типу ссылки
  • ✗Перегрузка (overloading) — это разновидность полиморфизма подтипов

Что спросят дальше

  • Что такое ковариантный тип возвращаемого значения?
  • Почему private-метод нельзя переопределить?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем