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

Что нужно добавить в сигнатуру класса для использования полиморфизма?

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

Аспектextendsimplements
НазначениеНаследование классаРеализация контракта
МножественностьОдин классМного интерфейсов
ПоляНаследуютсяНет
МетодыНаследуютсяРеализуются
IS-A отношениеИерархияКонтракт

Практические правила

  1. Используй интерфейсы для определения контрактов
  2. Наследуй классы только если есть IS-A отношение
  3. Избегай глубокой иерархии (больше 3 уровней)
  4. Предпочитай composition в некоторых случаях
  5. @Override для явного переопределения

Вывод: для полиморфизма нужно добавить extends (для класса) или implements (для интерфейса) в сигнатуру класса.

Что нужно добавить в сигнатуру класса для использования полиморфизма? | PrepBro