Для чего в Java используется аннотация `@Override`?

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

Ответ

Аннотация @Override используется для явного указания компилятору (и другим разработчикам), что метод в подклассе преднамеренно переопределяет метод из его суперкласса или реализует метод интерфейса.

Ключевые цели и преимущества:

  1. Контроль на этапе компиляции: Компилятор проверяет, действительно ли существует метод с такой же сигнатурой (имя, параметры, тип возвращаемого значения) в родительском классе или интерфейсе. Если нет — возникает ошибка компиляции, которая помогает быстро обнаружить опечатки или изменение контракта в родительском классе.

    class Animal {
        void makeSound() { }
    }
    class Cat extends Animal {
        @Override
        void makeSoud() { } // ОШИБКА КОМПИЛЯЦИИ: метод makeSoud() не найден в Animal
    }
  2. Улучшение читаемости кода: Явно показывает намерение разработчика и архитектурную связь между классами, облегчая понимание кода.

  3. Соблюдение контракта: Гарантирует, что переопределение соответствует правилам полиморфизма.

Пример корректного использования:

abstract class Shape {
    abstract double calculateArea();
}

class Circle extends Shape {
    private double radius;

    // Аннотация подтверждает, что мы правильно переопределяем абстрактный метод
    @Override
    double calculateArea() {
        return Math.PI * radius * radius;
    }
}

// @Override также используется при реализации методов интерфейса
class MyList implements List<String> {
    @Override
    public int size() { // Корректное переопределение метода из интерфейса List
        return 0;
    }
}

Использование @Override является хорошей практикой для всех переопределяемых методов.