← Назад к вопросам

Что такое полиморфизм с точки зрения кода?

1.0 Junior🔥 231 комментариев
#ООП#Основы Java

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

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Полиморфизм в Java

Полиморфизм (от греч. poly — много, morph — форма) — это способность объекта принимать разные формы и позволяет писать код, который работает с объектами разных типов одинаково. Это один из столпов ООП и основа для гибкого, расширяемого дизайна.

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

1. Параметрический полиморфизм (Compile-time)

Перегрузка методов (Method Overloading):

class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
    
    public double add(double a, double b) {
        return a + b;
    }
    
    public int add(int a, int b, int c) {
        return a + b + c;
    }
}

Компилятор выбирает метод на основе типов параметров и их количества. Это решается на этапе компиляции.

Дженерики (Generics):

public class Container<T> {
    private T value;
    
    public void set(T value) {
        this.value = value;
    }
    
    public T get() {
        return value;
    }
}

// Использование
Container<String> stringBox = new Container<>();
Container<Integer> intBox = new Container<>();

Один класс работает с разными типами.

2. Подтипный полиморфизм (Runtime)

Переопределение методов (Method Overriding):

abstract class Animal {
    abstract void makeSound();
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Woof!");
    }
}

class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("Meow!");
    }
}

// Полиморфизм в действии
Animal dog = new Dog();
Animal cat = new Cat();
dog.makeSound(); // Woof!
cat.makeSound(); // Meow!

Важный момент: переменная типа Animal может ссылаться на объекты разных подклассов. Вызванный метод определяется на этапе выполнения в зависимости от реального типа объекта.

Интерфейсы:

interface PaymentMethod {
    void pay(double amount);
}

class CreditCard implements PaymentMethod {
    @Override
    public void pay(double amount) {
        System.out.println("Paying " + amount + " via credit card");
    }
}

class PayPal implements PaymentMethod {
    @Override
    public void pay(double amount) {
        System.out.println("Paying " + amount + " via PayPal");
    }
}

// Работа с полиморфизмом
PaymentMethod method = new CreditCard();
method.pay(100); // Paying 100 via credit card

method = new PayPal();
method.pay(100); // Paying 100 via PayPal

Практическое применение

Пример: Collection Framework

List<Integer> list = new ArrayList<>();
list = new LinkedList<>(); // Один интерфейс, разные реализации

Преимущества:

  • Гибкость: легко добавлять новые типы без изменения существующего кода
  • Переиспользование: можно писать код один раз, использовать для многих типов
  • Слабая связанность: код зависит от абстракции, а не от конкретной реализации
  • Тестируемость: легко подменять реальные объекты на mock-объекты

Coupling vs Abstraction

Полиморфизм позволяет программировать в соответствии с принципом Dependency Inversion — зависеть от интерфейсов, а не от конкретных реализаций. Это делает код более надёжным и легче поддерживаемым.

Полиморфизм — это не просто механизм переиспользования кода, а мощный инструмент для создания расширяемой архитектуры.

Что такое полиморфизм с точки зрения кода? | PrepBro