Какой тип связывания (binding) используется для переопределенных методов в Java?

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

Ответ

Для переопределенных (overridden) методов в Java используется динамическое связывание (dynamic binding или late binding).

Почему? Конкретная реализация метода определяется во время выполнения (runtime) на основе фактического типа объекта, а не типа ссылки, через которую происходит вызов. Это основа полиморфизма.

Пример:

class Animal {
    void makeSound() {
        System.out.println("Животное издает звук");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() { // Переопределение метода
        System.out.println("Гав!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Dog(); // Ссылка типа Animal, объект типа Dog
        myAnimal.makeSound(); // Выведет "Гав!" (динамическое связывание)
    }
}

Как это работает: JVM использует таблицу виртуальных методов (vtable) для каждого класса, чтобы найти правильную реализацию во время выполнения.

Условия для динамического связывания:

  • Метод должен быть экземплярным (не static).
  • Метод должен быть доступен для переопределения (не private, final или static).
  • Должно существовать отношение наследования и фактическое переопределение метода.