От чего, кроме интерфейса, можно наследоваться в Java для реализации полиморфизма?

«От чего, кроме интерфейса, можно наследоваться в Java для реализации полиморфизма?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Полиморфизм в Java реализуется через наследование и переопределение методов. Помимо интерфейсов, для этого используются:

  1. Абстрактные классы (abstract class):

    • Могут содержать как абстрактные методы (без реализации, обязательные к переопределению), так и конкретные методы с реализацией.
    • Позволяют частично реализовать общую логику для группы классов.
    abstract class Shape {
        // Абстрактный метод - полиморфный контракт
        abstract double calculateArea();
    
        // Конкретный метод - общая логика
        void printInfo() {
            System.out.println("Area: " + calculateArea()); // Полиморфный вызов
        }
    }
    
    class Circle extends Shape {
        private double radius;
        @Override
        double calculateArea() { return Math.PI * radius * radius; } // Своя реализация
    }
  2. Обычные (конкретные) классы:

    • Полиморфизм достигается за счёт переопределения (@Override) методов родительского класса.
    • Позволяет модифицировать или расширять поведение унаследованных методов.
    class Transport {
        void move() {
            System.out.println("Transport is moving");
        }
    }
    
    class Airplane extends Transport {
        @Override
        void move() {
            System.out.println("Airplane is flying"); // Специфичная реализация
        }
    }
Сравнение подходов: Критерий Интерфейс (Java 8+) Абстрактный класс Обычный класс
Наследование Множественное Одиночное Одиночное
Реализация по умолчанию default-методы Конкретные и абстрактные методы Только конкретные методы
Состояние (поля) Только static final (константы) Любые поля Любые поля
Конструкторы Нет Есть Есть
Когда использовать Определение контракта, слабая связность Частичная общая реализация, близкая связь классов Полная реализация, которую нужно модифицировать