Найти тему
JavaKruzh

Что такое полиморфизм в ООП?

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

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

Напомню, что абстрактный класс-родитель - это Person, а наследники - Маг, Охотник и Рыцарь. Абстрактный метод - издание боевого клича. Очевидно, что Рыцарь будет доблестно бить кулаком в доспех и кричать "Слава Королю", Охотник издавать устрашающие звуки дикой природы, а Маг будет прославлять свою Академию Высшего Разума. Вот здесь мы и наблюдаем полиморфизм, каждый класс делает одно и то же (боевой клич), только по-своему.

Давайте попробуем это реализовать:

Для этого я добавляю в классах Mага, Охотника и Рыцаря метод makeBattleCry() и реализую его, дописывая тело метода. У каждого, как мы помним, оно свое. Над методом я проставляю аннотацию @Override, которая указывает Джаве, что мы переопределяем этот метод от родителя.

Напомню, как выглядит абстрактный класс-родитель Person:

-3

И теперь давайте проверим как работают наш боевой клич для каждого персонажа. Для этого я создам новый файл main, в котором создам экземпляр каждого класса и вызову у них метод.

-4

Обратите внимание на 3-5 строчки, где я создал объекты наших классов. Здесь при объявлении переменной я указал их родительский абстрактный класс Person, что является хорошей практикой. Это позволит нам в будущем, например, организовать массив типа Person[], поместить всех созданных персонажей и успешно пробежаться циклом и выполнить у каждого наш метод makeBattleCry(). Вуаля:

-5

Очень удобно, не правда ли?

Если остались какие-то вопросы или что-то нужно разобрать подробнее, буду признателен комментарию, постараюсь дописать и привести примеры)