Что такое полиморфизм
Что проверяют
Знаете ли вы, что полиморфизм не один, и понимаете ли, чем динамический отличается от статического.
Как отвечать
Полиморфизм это возможность работать с разными типами через единый интерфейс.
В Java он бывает нескольких видов:
- полиморфизм подтипов (динамический): переменная объявлена базовым типом, а метод вызывается тот, что определён у фактического объекта. Решение принимается во время выполнения через таблицу виртуальных методов;
List<Shape> shapes = List.of(new Circle(), new Square());
for (Shape s : shapes) s.draw(); // вызовется реализация конкретного класса- параметрический (обобщения): один код работает с разными типами, а проверка выполняется компилятором. Из-за стирания типов во время выполнения информации о типе нет;
- ad hoc (перегрузка): несколько методов с одним именем и разными параметрами. Выбор делается на этапе компиляции по объявленному типу аргумента, а не по фактическому.
Разница последних двух пунктов и есть частая ловушка: переопределение (override) разрешается динамически, перегрузка (overload) статически. Метод, принимающий Object, будет выбран, даже если внутри лежит String, если переменная объявлена как Object.
Зачем это нужно: код зависит от абстракции, а не от конкретных классов, поэтому добавление новой реализации не требует правки вызывающего кода. Это же лежит в основе принципа подстановки Лисков и инверсии зависимостей.
Где спотыкаются
Сводят полиморфизм только к переопределению методов.
Путают перегрузку и переопределение.
Не знают, что перегрузка разрешается статически.
Не могут привести пример параметрического полиморфизма, хотя пользуются обобщениями ежедневно.