Что такое полиморфизм с точки зрения кода?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Полиморфизм в 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 — зависеть от интерфейсов, а не от конкретных реализаций. Это делает код более надёжным и легче поддерживаемым.
Полиморфизм — это не просто механизм переиспользования кода, а мощный инструмент для создания расширяемой архитектуры.