Это правда о позднем связывании?
Я прочитал в "Мышление в Java" в главе "Полиморфизм" о понятии "Позднее связывание", я просто хочу знать, верно ли мое понимание этого понятия
Например, процедурные языки знают, где должна выполняться функция до времени выполнения
if(condition){func1();}else{func2();}
Таким образом, адрес каждой возможной функции известен точно и до запуска программы, поэтому она легко компилируется, но в OOL проверяют этот код,
makeItSpeak(Animal a ){
a.speak();
}
Хотя a может быть собакой, кошкой или любым другим типом Animal, и поскольку мы инициализируем объекты во время выполнения, мы должны передать аргумент, по которому мы запускаем, говорить во время выполнения, так что это позднее связывание, которое происходит при запуске -время....
ЭТО ПРАВДА??
4 ответа
Да, и это реализовано с использованием таблицы виртуальных методов.
В вашем примере speak()
это виртуальный (абстрактный) метод, который не имеет физического адреса. Во время выполнения, в зависимости от типа бетона Animal
подкласс, среда выполнения выясняет, какая реализация speak()
вызвать, ссылаясь на таблицу виртуальных методов.
Да. Например,
class A {
void a() { System.out.println("A"); }
}
class B extends A {
void a() { System.out.println("B"); }
}
class C {
public static void main (String[] args) {
A anA = new B();
anA.a(); // This will print B
}
}
Даже если переменная anA имеет тип A, экземпляр имеет тип B, который может быть определен только во время выполнения.
Гоча в этом правиле - статические методы, которые связываются во время компиляции, так что будьте внимательны.
Да вы правы. В приведенном вами примере правильный speak()
быть вызванным зависит от типа объекта, который будет известен во время выполнения. Только когда вы объявляете метод как окончательный, он подлежит раннему связыванию.
Да, вы правильно поняли. Это делает код более расширяемым и мощным.