Что такое переопределение метода (Overriding) в Java?

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

Ответ

Переопределение метода (Method Overriding) — это механизм ООП, позволяющий дочернему классу предоставить свою, специфическую реализацию метода, который уже существует в родительском классе. Цель — изменить или расширить поведение унаследованного метода.

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

  1. Сигнатура (имя, список параметров, тип возвращаемого значения) должна полностью совпадать.
  2. Используется аннотация @Override (строго рекомендуется). Она заставляет компилятор проверить, действительно ли метод переопределяет родительский, и предотвращает ошибки.
  3. Уровень доступа переопределяющего метода не может быть более строгим, чем у родительского (можно protected -> public, но не public -> private).
  4. Нельзя переопределить:
    • final методы.
    • static методы (это скрытие метода, а не переопределение).
    • private методы (они невидимы для подкласса).

Пример:

class Animal {
    // Метод, который будет переопределен
    public void makeSound() {
        System.out.println("The animal makes a sound.");
    }
}

class Dog extends Animal {
    @Override // Аннотация для проверки
    public void makeSound() {
        // Специфичная реализация для Dog
        System.out.println("The dog barks: Woof!");
    }
}

// Использование
Animal myAnimal = new Dog();
myAnimal.makeSound(); // Вывод: "The dog barks: Woof!" (Полиморфизм)

Связь с полиморфизмом: Переопределение — основа для полиморфизма времени выполнения (Runtime Polymorphism), когда вызываемый метод определяется типом фактического объекта, а не типом ссылки.