Полиморфизм – предоставляет возможность единообразно обрабатывать объекты с различной реализацией при условии наличия у них общего интерфейса или класса.
Полиморфизм в Java означает, что один и тот же метод может иметь разные реализации в разных классах. Простыми словами, это означает, что объекты одного класса могут использоваться как объекты другого класса.
1. Полиморфизм в общем смысле (Polymorphism) - возможность объекта принимать различные формы и реализовывать различное поведение. Объект "автомобиль" может принимать формы разных марок, моделей, цветов и размеров, но все они будут иметь общие свойства и методы, такие как двигатель, колеса, управление и т.д.
public class Car {
private String brand;
private String model;
private String color;
private int size;
public Car(String brand, String model, String color, int size) {
this.brand = brand;
this.model = model;
this.color = color;
this.size = size;
}
public void startEngine() {
System.out.println("Engine started.");
}
public void drive() {
System.out.println("Driving...");
}
}
public class Sedan extends Car {
public Sedan(String brand, String model, String color, int size) {
super(brand, model, color, size);
}
@Override
public void drive() {
System.out.println("Driving a sedan...");
}
}
public class SUV extends Car {
public SUV(String brand, String model, String color, int size) {
super(brand, model, color, size);
}
@Override
public void drive() {
System.out.println("Driving an SUV...");
}
}
В этом примере класс Car является суперклассом для классов Sedan и SUV. Оба подкласса переопределяют метод drive(), чтобы добавить свою собственную реализацию. Когда мы создаем объекты Sedan и SUV и вызываем метод drive(), будет вызвана соответствующая реализация для каждого класса.
2. Динамический = > Переопределение методов: возможность переопределить метод в подклассе, чтобы изменить его реализацию. Класс "Собака" может переопределить метод "голос", чтобы вместо обычного лая он издавал звук другого животного, например, мяукающего кота.
public class Dog {
public void bark() {
System.out.println("Woof!");
}
}
public class Chihuahua extends Dog {
@Override
public void bark() {
System.out.println("Yap yap!");
}
}
В этом примере класс Chihuahua переопределяет метод bark(), чтобы заменить обычный лай на более характерный звук.
3. Статический => Перегрузка методов: возможность создать несколько методов с одним и тем же именем в классе, но с разными параметрами. Класс "Калькулятор" может иметь несколько методов "сложение", которые будут принимать разное количество аргументов или разные типы данных (например, целые числа, дробные числа, строки).
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public String add(String a, String b) {
return a + " " + b;
}
}
В этом примере класс Calculator имеет несколько методов add(), которые принимают разные типы данных и возвращают разные результаты.
4. Параметрический полиморфизм (Parametric Polymorphism) - возможность создавать обобщенные типы данных, которые могут работать с различными типами данных. Класс "Список" может быть обобщенным типом данных, который может хранить элементы любого типа (например, целые числа, строки, объекты других классов).
public class List<T> {
private List<T> items;
public List() {
items = new ArrayList<>();
}
public void add(T item) {
items.add(item);
}
public T get(int index) {
return items.get(index);
}
}
В этом примере класс List является обобщенным типом данных, который может хранить элементы любого типа. При создании объекта List мы указываем тип элементов, например, List<String> или List<Integer>.
5. Подтиповый полиморфизм (Subtype Polymorphism) - возможность использовать объекты подкласса вместо объектов суперкласса. Класс "Птица" может быть суперклассом для классов "Орел", "Сокол", "Голубь" и т.д., и объекты этих подклассов могут использоваться везде, где ожидается объект класса "Птица".
public class Bird {
public void fly() {
System.out.println("Flying...");
}
}
public class Eagle extends Bird {
@Override
public void fly() {
System.out.println("Flying like an eagle...");
}
}
public class Sparrow extends Bird {
@Override
public void fly() {
System.out.println("Flying like a sparrow...");
}
}
В этом примере класс Bird является суперклассом для классов Eagle и Sparrow. Оба подкласса наследуют метод fly() от суперкласса, но переопределяют его, чтобы добавить свою собственную реализацию. Когда мы создаем объекты Eagle и Sparrow и вызываем метод fly(), будет вызвана соответствующая реализация для каждого класса.
6. Ad-hoc полиморфизм (Ad-hoc Polymorphism) - возможность использовать различные реализации функции для разных типов данных или аргументов. Функция "сложение" может иметь разные реализации для разных типов данных, например, для целых чисел она будет складывать числа, а для строк - объединять их в одну строку.
public class Addition {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public String add(String a, String b) {
return a + " " + b;
}
}
В этом примере класс Addition имеет несколько методов add(), которые имеют одно и то же имя, но разные параметры. Когда мы вызываем метод add() с разными типами данных, будет вызвана соответствующая реализация для каждого типа.