Можно ли переопределить метод во вложенном статическом классе Java?

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

Ответ

Нет, в классическом понимании полиморфного переопределения — нельзя. Статические методы привязаны к классу, а не к экземпляру объекта, поэтому они не поддерживают динамическую диспетчеризацию (полиморфизм).

Что происходит вместо переопределения? Если в подклассе объявить статический метод с той же сигнатурой, что и статический метод в суперклассе, происходит сокрытие метода (method hiding).

Ключевые отличия сокрытия от переопределения:

  • Связывание: При сокрытии вызов метода разрешается на этапе компиляции по типу ссылки, а не по типу реального объекта (как при переопределении).
  • Аннотация: Для статического метода нельзя использовать @Override.

Пример сокрытия метода:

class Outer {
    static class Parent {
        static void print() {
            System.out.println("Static Parent");
        }
    }

    static class Child extends Parent {
        // Сокрытие метода Parent.print(), а не переопределение
        static void print() {
            System.out.println("Static Child");
        }
    }

    public static void main(String[] args) {
        Parent ref = new Child();
        Parent.print(); // "Static Parent" — вызов по классу Parent
        Child.print();  // "Static Child"  — вызов по классу Child
        ref.print();    // "Static Parent" — КРИТИЧНО: вызов определяется типом ссылки (Parent), а не объектом (Child)!
    }
}

Вывод: Для реализации полиморфного поведения используйте обычные (не статические) методы.