Что такое полиморфизм в ООП: зачем нужен, примеры использования

Интернет-маркетолог
Стаж 10 лет
Опубликовано: 20.10.2026

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

Без этого сложно читать программы с наследованием и интерфейсами и отличать перегрузку метода от переопределения. Дальше разобраны определение, виды, примеры на Java и JavaScript, а также преимущества и цена полиморфизма. Тем, кто хочет изучить ООП глубже, пригодятся книги для программистов.

10 часов вебмастеринга на 3 месяца в подарок
Для выполнения технических доработок сайта. Поможем оперативно устранить мелкие баги, настроить формы заявок, поправить вёрстку или обновить контент.


Читайте также:

Содержание
Навигация по статье
Что такое полиморфизм в ООП
  1. Что такое полиморфизм в ООП
  2. Как работает полиморфизм в классах и интерфейсах
  3. Виды полиморфизма
  4. Примеры полиморфизма на Java и JavaScript
  5. Преимущества и недостатки полиморфизма
  6. FAQ по полиморфизму
  7. Коротко о главном

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

Полиморфизм в ООП — это возможность обращаться через одно имя метода или функции к данным разных типов. Например, объекты разных классов по-своему отвечают на один и тот же вызов метода. Учебник Oracle по Java объясняет, что название пришло из биологии, где слово означает «много форм». В ООП подклассы могут определять собственное поведение и при этом сохранять часть функциональности родителя.

Для примера возьмем интернет-магазин с двумя товарами, мячом и шахматами. Каждому товару соответствует свой класс, а у обоих есть метод AddToCart. Код корзины вызывает AddToCart одинаково, а что именно происходит при вызове, определяет класс товара. Если появится третий товар, для него достаточно добавить новый класс с тем же методом: код корзины менять не придется, пока он работает с общим типом товара.

Простыми словами, полиморфизм — это то, что позволяет использовать один и тот же метод для разных объектов.

Как работает полиморфизм в классах и интерфейсах

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

Абстрактный класс — это класс, объявленный с ключевым словом abstract: его экземпляр создать нельзя, но от него можно наследовать. Он задает общую основу для дочерних классов. Класс в Java может наследовать только от одного класса, абстрактного или обычного.

Интерфейс в Java — это, как правило, группа связанных методов без тел, то есть контракт между классом и остальной программой. Если не абстрактный класс заявляет, что реализует интерфейс, он обязан реализовать все абстрактные методы интерфейса, иначе код не скомпилируется. Абстрактный класс может реализовать их частично, а методы по умолчанию (default) реализовывать не обязательно. Число интерфейсов, которые реализует класс, не ограничено. Подробнее о понятии рассказывает статья об интерфейсе.

Прежде чем выносить метод в общий интерфейс, выпишите, какие операции должны поддерживать все классы, а какие нужны только отдельным. В интерфейс попадает только первое, иначе его придется менять при каждом новом классе.
Егор Трушников
Директор по развитию и стратегическим продуктам в Kокос Group
Егор Трушников

Полиморфизм входит в число принципов ООП. Документация C# называет четыре основных принципа: абстракцию, инкапсуляцию, наследование и полиморфизм. Это отдельные принципы, но в примере с магазином они работают вместе: интерфейс или абстрактный класс задает общий тип товара, наследование создает классы конкретных товаров, а полиморфизм описывает их разное поведение при вызове AddToCart.

5 классных SEO-кейсов
Круче, чем Гудини: как мы вырастили трафик в 2,2 раза

Все вы прекрасно знаете Гарри Гудини: этот фокусник мог выбраться из закрытой бочки, брошенной в воду. Примерно в таких же рамках оказались и мы, начиная работу с сайтом Eurorepar. Узкий функционал, жесткие требования. Но мы справились без магии, увеличив трафик х2!

Как выжать максимум из двадцатилетнего сайта

Можно ли выжать максимум из 20-летнего сайта и докрутить его до современных стандартов? А если есть отягчающие обстоятельства — накрутка поведенческих факторов, антиботы, да еще и админка капризничает и сама удаляет категории?

Долгая дорога в SEO и мощный прорыв

Наш клиент — интернет-магазин B2B промышленной тематики. Он достался нам после предыдущих подрядчиков, и первые год-два мы исправляли их ошибки. А потом началась долгая кропотливая работа, которая в итоге принесла желанный результат.

Qugo: вырастили трафик из блога платформы b2b в 9,7 раз!

Молодой сайт, сложная тематика b2b, крупные конкуренты — с такими вводными трафик и позиции оставляли желать лучшего. Но бы добились цели: повысили трафик и позиции, улучшили узнаваемость бренда

Эффективное ссылочное продвижение для федеральной аптечной сети

Федеральная аптечная сеть пришла в Kokoc Performance (входит в Kokoc Group) за ссылочным продвижением. Интересно, что в компании есть своя in-house команда по SEO, которая подготовила ссылочную стратегию, а за ее реализацией обратилась к нам.

1/5

Читайте также:

Виды полиморфизма

Чаще всего выделяют три формы полиморфизма. Различаются они тем, что связывает общее имя: общий родительский класс, единый код для разных типов или произвольный набор типов.

  1. Полиморфизм подтипов (наследование). Одно имя обозначает объекты разных классов с общим родителем. Вызов, адресованный родительскому типу, срабатывает у каждого дочернего класса по-своему.
  2. Параметрический полиморфизм. Нет привязки к конкретному типу: функция, как правило, работает единообразно с разными типами.
  3. Полиморфизм ad hoc. Одно имя и разное поведение для разных типов. Одним из механизмов служит перегрузка методов, но с ней ad hoc не совпадает.

Пример одного имени для разных типов данных — встроенная функция len() в Python. По документации Python, ее аргументом может быть последовательность (строка, bytes, кортеж, список, range) или коллекция (словарь, множество, frozenset), и во всех случаях функция возвращает число элементов объекта. Так одно имя обслуживает разные типы данных.

Статический и динамический полиморфизм

Полиморфизм различают и по моменту, когда выбирается реализация. При статическом полиморфизме ее выбирают при компиляции, при динамическом полиморфизме — во время выполнения программы. Статический вариант типичен для ad hoc и параметрического полиморфизма, а динамический обычно связан с полиморфизмом подтипов.

Чтобы понять, какой метод сработает, спросите себя, что определяет выбор: список параметров (решается при компиляции) или тип объекта (решается при выполнении).

В Java этому делению соответствуют два механизма, которые описывает спецификация языка. Перегрузка — это методы с одним именем и разными списками параметров: компилятор выбирает подходящий метод по имени и аргументам вызова, а тип возвращаемого значения в выборе не участвует. Переопределение — это замена реализации метода родителя в дочернем классе: во время выполнения вызывается переопределяющий метод того объекта, у которого произошел вызов.

ПризнакСтатический полиморфизмДинамический полиморфизм
Когда выбирается реализацияПри компиляцииПри выполнении программы
Типичные формыAd hoc и параметрическийПолиморфизм подтипов
Пример в JavaПерегрузка: одно имя, разные параметрыПереопределение: дочерний класс заменяет метод
Скорость и гибкостьОбычно быстрее, нужна поддержка компилятораГибче, но медленнее

Примеры полиморфизма на Java и JavaScript

Первый пример показывает перегрузку метода в Java. В классе четыре метода shapearea с одним именем и разными списками параметров: без параметров, с радиусом, с основанием и высотой, с длиной и шириной. Какой из них выполнится, зависит от аргументов вызова, то есть от фигуры, площадь которой нужно найти.

Пример кода на Java с перегрузкой метода
Пример кода с перегрузкой метода. Источник: авторское изображение

Второй пример показывает переопределение. Дочерний класс Cars наследует родительский класс Vehicles и объявляет метод drive() с тем же именем и параметрами, что и у родителя. Метод дочернего класса заменяет реализацию родителя, поэтому программа выводит строку «Управлять автомобилем». Переменная model в этом коде имеет тип Cars, поэтому выбор метода по типу объекта здесь не виден.

Пример кода на Java с переопределением метода
Пример кода с переопределением метода. Источник: авторское изображение

Чтобы увидеть полиморфный вызов, объявите переменную родительского типа и присвойте ей объект дочернего класса, например Vehicles model = new Cars();. Тогда метод выбирается по объекту, а не по типу переменной.

Третий пример написан на JavaScript. Ключевое слово class объявляет класс, а extends делает его потомком другого класса, как поясняет документация MDN Web Docs. На картинке три класса, firstClass, secondClass и thirdClass: каждый следующий наследует предыдущий, а метод add() определен в каждом из них по-своему. Результат зависит от того, у объекта какого класса вызван этот метод.

Пример наследования классов в JavaScript
Пример наследования классов в JavaScript. Источник: авторское изображение

Преимущества и недостатки полиморфизма

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

  • Повторное использование кода. Подклассы в Java сохраняют часть функциональности родителя и добавляют свое поведение, поэтому общую часть не нужно писать заново для каждого класса. Это свойство наследования, которое в ООП используется вместе с полиморфизмом.
  • Расширяемость и гибкость. Новый класс с тем же методом можно подставить на место существующих, и код, написанный под общий интерфейс, продолжит работать.
  • Единый контракт. В Java интерфейс задает методы, которые обязан реализовать каждый не абстрактный класс с этим интерфейсом, а компилятор проверяет это при сборке.

Если над общим интерфейсом работают несколько команд, заранее назначьте того, кто принимает изменения в описании метода. Договоренность стоит зафиксировать до начала разработки, а не после первых расхождений.
Рудакова Светлана
Руководитель комплексных проектов Kokoc Performance
Рудакова Светлана

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

Качественная оценка удобства сайта
Мы смотрим:
  • тепловые карты скроллинга страниц и кликов
  • отчеты из систем аналитики
  • записи поведения конкретных пользователей
Узнать больше

Читайте также:

FAQ по полиморфизму

Как в Python выбрать реализацию функции по типу аргумента?

Для этого в модуле functools есть декоратор @singledispatch. Он превращает функцию в обобщенную, и реализация выбирается по типу первого аргумента. По документации Python, реализации для других типов добавляют через метод register() такой функции.

Какие методы Java нельзя переопределить?

Нельзя переопределить final-методы: модификатор final запрещает это прямо. Статический метод подкласса не переопределяет метод родителя, а скрывает его. Спецификация Java допускает переопределение только для методов с доступом public, protected или пакетным (без модификатора доступа, действует в том же пакете), поэтому закрытый private-метод родителя в подклассе не переопределяется.

Есть ли полиморфизм в Python без явных интерфейсов?

Есть, одним из механизмов служит утиная типизация. При ней тип объекта не проверяют, а просто вызывают нужный метод, и, как сказано в документации Python, акцент на интерфейсах, а не на конкретных типах повышает гибкость хорошо спроектированного кода за счет полиморфной подстановки. Абстрактные базовые классы дополняют утиную типизацию, когда другие приемы, например проверка через hasattr(), были бы неуклюжими или неточными.

Коротко о главном

  • Полиморфизм — одна из базовых концепций ООП: одно имя метода или функции работает с данными разных типов, а у объектов разных классов один и тот же вызов выполняется по-разному.
  • Чаще всего выделяют три формы: полиморфизм подтипов, параметрический и ad hoc.
  • Статический полиморфизм выбирает реализацию при компиляции, динамический при выполнении. В Java перегрузка относится к первому, переопределение ко второму.
  • Общую часть кода не нужно дублировать, а новые классы с тем же методом подставляются на место существующих.
  • Динамический полиморфизм гибче, но, как правило, медленнее статического.

Ручной экспресс-SEO-аудит сайта
SEO-специалист
  • проверит ключевые элементы продвижения 
  • найдёт реальные точки роста проекта

Получить аудит

Комментарии (5)

Д
Денис Тихонов
20.10.2026 23:54 ★ ★ ★ ★ ★
Раньше часто сомневался в адекватности оценок от наших разрабов на добавление новых товаров в корзину. Оказывается, за счет полиморфизма им реально не нужно переписывать движок, поэтому фичи выкатываются без раздувания бюджета.
А
А. Кузьмина
20.10.2026 23:27 ★ ★ ★ ★ ★
Ваша логика с универсальными методами отлично защищает заказчика от лишних трат на программистов. Мы внедряли похожую схему для обработки заявок, что сберегло проекту 214 тысяч рублей и ускорило старт на 18 дней.
A
Artem_SPb
23.10.2026 15:57 ★ ★ ★ ★ ★
Выходит, эта концепция позволяет бесконечно расширять товарные матрицы без риска сломать базовую логику продаж. А как сильно этот динамический выбор метода бьет по скорости загрузки витрины для конечного юзера?
K
Kokoc Perfomance
23.10.2026 16:31
Динамический выбор реализации действительно добавляет накладные расходы, но в большинстве реальных витрин это доли миллисекунд на вызов и они тонут в сетевых задержках, работе БД и фронта. Узкое место почти всегда не в полиморфизме, а в лишних запросах и тяжёлых данных, поэтому мы обычно оптимизируем архитектуру витрины и кэширование, оставляя саму концепцию безопасного расширения матрицы без изменений.
P
PythonMax
24.10.2026 22:51 ★ ★ ★ ★ ★
Хорошая шпаргалка, чтобы быстро освежить базу перед собеседованием.
💬 Оставить комментарий
Не забудьте на нас
подписаться!
Тут собрано всё самое интересное. Рассказываем и вдохновляем
Max
TenChat
Telegram
ВКонтакте
Популярные статьи автора
Узнайте стоимость продвижения сейчас
Выберите удобный способ связи:
Выберите удобный способ связи:
Max Telegram
Введите Ваш номер телефона:*
Введите адрес Вашего сайта:*
Введите Ваше имя:*

Введите Ваш Email:*
Введите адрес Вашего сайта:*
Введите Ваше имя:*

Оперативно отвечаем в рабочее время: с 10:00 до 19:00
Оперативно отвечаем в рабочее время: с 10:00 до 19:00
Вы уже проголосовали
Возьмем ТОП вместе?

Цена лидов в различных нишах
Тематика Стоимость лида (Москва/Россия)
Отдых 500
Мебель 350
Оборудование 500
Бансковские услуги 500
Безопасность 500
Организация мероприятий, концерты, праздники 500
Недвижимость 500
Строительство и отделка 500
Грузоперевозки 500
Доставка еды 350
Юридические услуги 500
Бухгалтерские услуги 500
Пластиковые окна 500
Детские товары 350
Автозапчасти 350
Образование 500
Возьмем ТОП вместе?

Оставить заявку сейчас
Выберите интересующую услугу *

Подпишитесь на рассылку
Не пропустите самое интересное из мира SEO и Digital. Только актуальные и самые крутые статьи.
Заявка успешно отправлена!
Наши сотрудники уже приступили к анализу Вашего сайта. Наш менеджер свяжется с вами в течение дня, спасибо!
Напишите нам Max Telegram