You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: oop.md
+44-3Lines changed: 44 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -410,11 +410,52 @@ class Car {
410
410
[к оглавлению](#ООП)
411
411
412
412
## Что такое _статическое_ и _динамическое связывание_?
413
-
Присоединение вызова метода к телу метода называется связыванием. Если связывание проводится компилятором (компоновщиком) перед запуском программы, то оно называется _статическим_ или _ранним связыванием (early binding)_.
414
413
415
-
В свою очередь, _позднее связывание (late binding)_ это связывание, проводимое непосредственно во время выполнения программы, в зависимости от типа объекта. Позднее связывание также называют _динамическим (dynamic)_ или _связыванием на стадии выполнения (runtime binding)_. В языках, реализующих позднее связывание, должен существовать механизм определения фактического типа объекта во время работы программы, для вызова подходящего метода. Иначе говоря, компилятор не знает тип объекта, но механизм вызова методов определяет его и вызывает соответствующее тело метода. Механизм позднего связывания зависит от конкретного языка, но нетрудно предположить, что для его реализации в объекты должна включаться какая-то дополнительная информация.
414
+
_Связывание (binding)_- это сопоставление вызванного метода с конкретной реализацией (участком памяти), которая будет исполнена.
416
415
417
-
Для всех методов Java используется механизм позднего (динамического) связывания, если только метод не был объявлен как `final`, `static` или `private` (приватные методы являются `final` по умолчанию).
416
+
_Early binding (static/compile-time)_ - связывание происходит на этапе компиляции. Компилятор может точно определить, какой метод вызвать по типу переменной, т.е. по типу ссылки на объект. Используется в следующих случаях:
a.say("hello"); // "Animal says hello" - compiler chose the implementation
438
+
```
439
+
440
+
_Late binding (dynamic/runtime)_ - связывание происходит во время выполнения программы по типу объекта, а не по типу ссылки. Данный вид связывания используется при вызове переопределенных (overridden) методов. Late binding обеспечивает полиморфизм.
441
+
442
+
```java
443
+
classAnimal {
444
+
voidsound() { System.out.println("Some sound"); }
445
+
}
446
+
447
+
classDogextendsAnimal {
448
+
@Override
449
+
voidsound() { System.out.println("Woof"); }
450
+
}
451
+
452
+
Animal a =newDog();
453
+
a.sound(); // "Woof"
454
+
```
455
+
456
+
Вызов методов при late binding происходит через vtable (virtual method table). _vtable_ - это таблица указателей на реализации методов, которую JVM создает для каждого класса на этапе компиляции. Обращение происходит по индексу к таблице класса объекта, на котором был вызван метод.
457
+
458
+
Важно: vtable не является частью спецификации JVM, это конкретная реализация динамической диспетчеризации (dynamic dispatch) в большинстве JVM.
0 commit comments