Почему статический метод в Java нельзя переопределить?

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

Ответ

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

Ключевые отличия:

  • Обычный (instance) метод: Связывание (binding) происходит во время выполнения (динамическое).
  • Статический (class) метод: Связывание происходит во время компиляции (статическое).

Пример (Method Hiding - сокрытие метода):

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

class Child extends Parent {
    // Это не переопределение, а сокрытие метода родительского класса.
    // Аннотация @Override здесь вызовет ошибку компиляции.
    static void print() {
        System.out.println("Static method in Child");
    }
}

public class Main {
    public static void main(String[] args) {
        Parent parentRef = new Child(); // Ссылка типа Parent на объект Child
        parentRef.print(); // Выведет: "Static method in Parent"
        // Решение принимается по типу ссылки (Parent), а не по объекту (Child).

        Child childRef = new Child();
        childRef.print(); // Выведет: "Static method in Child"

        // Правильный способ вызова статических методов - по имени класса:
        Parent.print(); // "Static method in Parent"
        Child.print();  // "Static method in Child"
    }
}

Для достижения полиморфного поведения необходимо использовать нестатические методы и аннотацию @Override.