Какой метод в Java невозможно переопределить в классе-наследнике?

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

Ответ

В Java нельзя переопределить метод, объявленный с модификатором final. Попытка сделать это приведет к ошибке компиляции.

Почему используется final: Чтобы запретить изменение критичной логики в наследниках, гарантировать безопасность (например, в иммутабельных классах) или оптимизировать выполнение.

Пример ошибки переопределения final-метода:

class Parent {
    // Объявление final метода
    public final void displayId() {
        System.out.println("Parent ID: 100");
    }
}

class Child extends Parent {
    // ОШИБКА КОМПИЛЯЦИИ: Cannot override the final method from Parent
    @Override
    public void displayId() { 
        System.out.println("Child ID: 200");
    }
}

Другие случаи, которые не являются переопределением:

  • private методы: Не наследуются, поэтому в дочернем классе можно создать метод с такой же сигнатурой, но это будет новый, независимый метод, а не переопределение.
  • static методы: Связаны с классом, а не с экземпляром. Если в дочернем классе объявить статический метод с такой же сигнатурой, он скроет (hide) метод родителя, но не переопределит его. Вызов зависит от типа ссылки, а не от реального объекта.
class Parent {
    public static void staticMethod() { System.out.println("Parent static"); }
    private void privateMethod() { System.out.println("Parent private"); }
}

class Child extends Parent {
    // Это скрытие (hiding), а не переопределение.
    public static void staticMethod() { System.out.println("Child static"); }
    // Это совершенно новый метод, не связанный с Parent.privateMethod().
    private void privateMethod() { System.out.println("Child private"); }
}