← Назад к вопросам
Что нужно добавить в сигнатуру класса для использования полиморфизма?
1.0 Junior🔥 121 комментариев
#Другое
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Полиморфизм в Java: наследование и интерфейсы
Основы полиморфизма
Полиморфизм позволяет объектам разных типов использовать одинаковый интерфейс. В Java существует два основных вида:
1. Наследование (extends)
Для наследования нужно добавить extends в сигнатуру класса:
// Родительский класс
public abstract class Animal {
public abstract void makeSound();
public void sleep() {
System.out.println("Animal is sleeping");
}
}
// Наследование
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof!");
}
}
public class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Meow!");
}
}
// Использование полиморфизма
public class AnimalTest {
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
dog.makeSound(); // Woof!
cat.makeSound(); // Meow!
}
}
2. Интерфейсы (implements)
Для реализации интерфейса используем implements:
// Интерфейс
public interface Drawable {
void draw();
void resize(int size);
}
// Реализация интерфейса
public class Circle implements Drawable {
@Override
public void draw() {
System.out.println("Drawing circle");
}
@Override
public void resize(int size) {
System.out.println("Resizing circle to " + size);
}
}
public class Rectangle implements Drawable {
@Override
public void draw() {
System.out.println("Drawing rectangle");
}
@Override
public void resize(int size) {
System.out.println("Resizing rectangle to " + size);
}
}
// Использование
public class ShapeTest {
public static void main(String[] args) {
List<Drawable> shapes = new ArrayList<>();
shapes.add(new Circle());
shapes.add(new Rectangle());
for (Drawable shape : shapes) {
shape.draw(); // Полиморфное поведение
shape.resize(10);
}
}
}
3. Множественная реализация интерфейсов
Класс может реализовывать несколько интерфейсов:
public interface Movable {
void move();
}
public interface Drawable {
void draw();
}
public class Vehicle implements Movable, Drawable {
@Override
public void move() {
System.out.println("Vehicle is moving");
}
@Override
public void draw() {
System.out.println("Drawing vehicle");
}
}
4. Наследование интерфейсов
Интерфейсы могут наследоваться от других интерфейсов через extends:
public interface Shape {
void draw();
}
public interface Resizable extends Shape {
void resize(int size);
}
public class Circle implements Resizable {
@Override
public void draw() {
System.out.println("Drawing circle");
}
@Override
public void resize(int size) {
System.out.println("Resizing to " + size);
}
}
5. Абстрактный класс + интерфейсы
public abstract class Vehicle {
public abstract void start();
}
public interface Drawable {
void draw();
}
public class Car extends Vehicle implements Drawable {
@Override
public void start() {
System.out.println("Car engine started");
}
@Override
public void draw() {
System.out.println("Drawing car");
}
}
Полиморфизм в действии
public class PolymorphismExample {
// Метод принимает родительский тип
public static void displayAnimal(Animal animal) {
animal.makeSound();
animal.sleep();
}
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
// Передаём разные типы в один метод
displayAnimal(dog); // Вызовется Dog.makeSound()
displayAnimal(cat); // Вызовется Cat.makeSound()
}
}
Сравнение extends vs implements
| Аспект | extends | implements |
|---|---|---|
| Назначение | Наследование класса | Реализация контракта |
| Множественность | Один класс | Много интерфейсов |
| Поля | Наследуются | Нет |
| Методы | Наследуются | Реализуются |
| IS-A отношение | Иерархия | Контракт |
Практические правила
- Используй интерфейсы для определения контрактов
- Наследуй классы только если есть IS-A отношение
- Избегай глубокой иерархии (больше 3 уровней)
- Предпочитай composition в некоторых случаях
- @Override для явного переопределения
Вывод: для полиморфизма нужно добавить extends (для класса) или implements (для интерфейса) в сигнатуру класса.