Что такое переопределение методов в ООП?

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

Ответ

Переопределение методов (method overriding) — это механизм в объектно-ориентированном программировании, позволяющий дочернему классу предоставить свою, специфическую реализацию метода, который уже определён в его родительском классе.

Условия корректного переопределения в Java:

  1. Та же сигнатура: Имя метода, тип, количество и порядок параметров должны совпадать.
  2. Совместимый возвращаемый тип: В Java 5+ допускается ковариантный возвращаемый тип (можно вернуть подтип исходного типа).
  3. Нельзя сужать модификатор доступа: Доступ в дочернем классе должен быть таким же или шире (public → public, protected → public/protected).
  4. Нельзя добавлять новые проверяемые исключения: Можно добавлять только непроверяемые (unchecked) или сужать тип исключений.

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

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

    protected String getFood() {
        return "some food";
    }
}

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

    // Ковариантный возвращаемый тип (String — подтип Object)
    @Override
    public String getFood() {
        return "dog food";
    }
}

Что нельзя переопределить?

  • final методы.
  • static методы (это скрытие метода, а не переопределение).
  • private методы (они не видны в дочернем классе).

Зачем это нужно? Переопределение — основа полиморфизма времени выполнения (runtime polymorphism). Оно позволяет объектам дочерних классов отвечать на одни и те же вызовы методов по-разному, что делает код гибким и расширяемым.