Может ли класс-наследник переопределить метод родительского класса?

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

Ответ

Да, может, но при соблюдении строгих условий. Переопределение (override) — ключевой механизм полиморфизма в ООП.

Условия для переопределения:

  1. Метод в родительском классе не должен быть объявлен как final, private или static.
  2. Сигнатура метода (имя, тип и порядок параметров) должна совпадать.
  3. Возвращаемый тип должен быть совместим (тот же тип или его подтип — ковариантный возвращаемый тип).
  4. Модификатор доступа не может быть более строгим, чем у родительского метода.

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

class Vehicle {
    protected String getDescription() {
        return "Транспортное средство";
    }
}

class Car extends Vehicle {
    @Override // Аннотация помогает компилятору проверить переопределение
    public String getDescription() {
        return "Автомобиль: " + super.getDescription();
    }
}

Важные исключения:

  • private методы не наследуются, поэтому их нельзя переопределить.
  • static методы скрываются (hide), а не переопределяются.
  • Аннотация @Override — лучшая практика для явного указания намерения и проверки компилятором.