Какие правила переопределения метода в Java?

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

Ответ

Переопределение (overriding) позволяет подклассу предоставить свою реализацию метода, уже определённого в суперклассе.

Основные правила:

  1. Сигнатура: Имя метода и список параметров (типы, порядок) должны в точности совпадать.
  2. Возвращаемый тип: Должен быть тем же или ковариантным (подтипом) возвращаемого типа метода родителя.
  3. Модификатор доступа: Не может быть более строгим, чем у переопределяемого метода (можно ослабить: protected -> public).
  4. Модификатор final: Метод, объявленный как final, переопределить нельзя.
  5. Модификатор static: Статические методы не переопределяются, а скрываются.
  6. Модификатор private: Приватные методы не видны в подклассе, поэтому не переопределяются.
  7. Исключения: Переопределённый метод может:
    • Не объявлять никаких проверяемых исключений (checked exceptions).
    • Объявлять меньше или более конкретные (подклассы) проверяемые исключения.
    • Объявлять любые непроверяемые исключения (unchecked exceptions).

Пример корректного переопределения:

class Vehicle {
    protected String getDetails() {
        return "Generic Vehicle";
    }
}

class Car extends Vehicle {
    @Override // Аннотация помогает компилятору проверить правила
    public String getDetails() { // Модификатор доступа ослаблен (protected -> public)
        return "Sports Car";
    }
}

Аннотация @Override — строго рекомендуется. Она заставляет компилятор проверить, действительно ли метод переопределяет метод суперкласса, и предотвращает ошибки в именах или сигнатурах.