Полиморфизм — один из ключевых принципов объектно-ориентированного программирования (ООП) в Java. Он позволяет объектам разных типов обрабатываться через единый интерфейс, а вызов метода определяется во время выполнения (динамический полиморфизм) или компиляции (статический полиморфизм, т.е. перегрузка методов).
Ниже приведены 10 примеров полиморфизма в Java, охватывающих как переопределение (overriding), так и перегрузку (overloading) методов:
1. Переопределение метода toString()
class Animal {
@Override
public String toString() {
return "Это животное";
}
}
class Dog extends Animal {
@Override
public String toString() {
return "Это собака";
}
}
// Использование:
Animal a = new Dog();
System.out.println(a); // Выведет: Это собака
2. Переопределение метода equals()
class Person {
String name;
Person(String name) { this.name = name; }
@Override
public boolean equals(Object obj) {
if (obj instanceof Person p) {
return this.name.equals(p.name);
}
return false;
}
}
3. Полиморфизм через интерфейс
interface Drawable {
void draw();
}
class Circle implements Drawable {
public void draw() { System.out.println("Рисуем круг"); }
}
class Rectangle implements Drawable {
public void draw() { System.out.println("Рисуем прямоугольник"); }
}
// Использование:
Drawable d = new Circle();
d.draw(); // Рисуем круг
4. Полиморфизм через абстрактный класс
abstract class Shape {
abstract double area();
}
class Square extends Shape {
double side;
Square(double side) { this.side = side; }
double area() { return side * side; }
}
// Использование:
Shape s = new Square(5);
System.out.println(s.area()); // 25.0
5. Массив полиморфных объектов
Animal[] animals = { new Dog(), new Animal() };
for (Animal a : animals) {
System.out.println(a); // Вызов toString() с учётом реального типа
}
6. Перегрузка методов (статический полиморфизм)
class Calculator {
int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; }
int add(int a, int b, int c) { return a + b + c; }
}
7. Полиморфизм при передаче параметров
void feed(Animal a) {
System.out.println("Кормим: " + a);
}
feed(new Dog()); // Вызов с подклассом
8. Полиморфизм через обобщённые (generic) коллекции и интерфейсы
List<Drawable> shapes = new ArrayList<>();
shapes.add(new Circle());
shapes.add(new Rectangle());
for (Drawable d : shapes) {
d.draw(); // Вызов метода конкретной реализации
}
9. Полиморфизм с использованием анонимных классов
Drawable triangle = new Drawable() {
public void draw() {
System.out.println("Рисуем треугольник");
}
};
triangle.draw(); // Рисуем треугольник
10. Полиморфизм в обработке исключений
try {
// ...
} catch (IOException e) {
System.out.println("Ошибка ввода-вывода");
} catch (Exception e) {
System.out.println("Общая ошибка");
}
// Здесь обрабатывается иерархия исключений — тоже форма полиморфизма
Кратко:
- Динамический полиморфизм: через наследование и переопределение (
@Override). - Статический полиморфизм: через перегрузку методов (
overloading).
Все эти примеры демонстрируют, как Java позволяет писать гибкий и расширяемый код за счёт полиморфизма.