Статическое (Compile-time) связывание происходит на этапе компиляции. Компилятор определяет вызываемый метод, основываясь на типе ссылки. Оно применяется для приватных, статических, final-методов и конструкторов, потому что их реализация известна во время компиляции.
Динамическое (Runtime) связывание происходит на этапе выполнения. Виртуальная машина Java (JVM) определяет вызываемый метод, основываясь на фактическом типе объекта, на который ссылается переменная. Это основной механизм при работе с полиморфизмом, когда подкласс переопределяет метод суперкласса.
Пример:
java
В этом примере animal.makeSound() демонстрирует динамическое связывание. Хотя переменная animal имеет статический тип Animal, фактический объект, на который она ссылается, является экземпляром Dog. JVM определяет это во время выполнения и вызывает переопределенный метод makeSound() из класса Dog.
Сравнение:
| Характеристика | Статическое связывание | Динамическое связывание |
|---|---|---|
| Этап связывания | Компиляция | Выполнение |
| Определяется по | Тип ссылки | Фактический тип объекта |
| Для методов | private, static, final, конструкторы | Виртуальные методы (обычные методы экземпляра) |
| Поддержка полиморфизма | Нет | Да (через переопределение методов) |
| Скорость | Быстрее | Медленнее (небольшие накладные расходы JVM) |