Это правда о позднем связывании? - PullRequest
2 голосов
/ 01 октября 2010

Я прочитал в «Мышление в Java» в главе «Полиморфизм» о понятии «Позднее связывание», я просто хочу знать, верно ли мое понимание этой концепции

Процедурные языки знают, где находится функциянапример, выполнить до времени выполнения

if(condition){func1();}else{func2();}

Таким образом, адрес каждой возможной функции известен точно и до запуска программы, поэтому он легко компилируется, но в OOL проверяется этот код ,,

makeItSpeak(Animal a ){
  a.speak();
}

Хотя a может быть собакой, кошкой или любым другим типом Animal, и поскольку мы инициализируем объекты во время выполнения, мы должны передать аргумент, по которому мы говорим, во время выполнения, так что этопозднее связывание, которое происходит во время выполнения ....

ЭТО ИСТИНА ??

Ответы [ 4 ]

4 голосов
/ 01 октября 2010

Да, и это реализовано с использованием таблицы виртуальных методов .

В вашем примере speak() - это виртуальный (абстрактный) метод, который не имеет физического адреса.Во время выполнения, основываясь на типе конкретного подкласса Animal, среда выполнения выясняет, какую реализацию speak() вызывать, обращаясь к таблице виртуальных методов.

2 голосов
/ 01 октября 2010

Да. Например,

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, который можно определить только во время выполнения.

Гоча в этом правиле - статические методы, которые связываются во время компиляции, так что будьте внимательны.

1 голос
/ 01 октября 2010

Да, вы правы.В приведенном вами примере правильный speak(), который нужно вызвать, зависит от типа объекта, который будет известен во время выполнения.Только когда вы объявляете метод как final , он подлежит раннему связыванию.

0 голосов
/ 01 октября 2010

Да, вы правильно поняли.Это делает код более расширяемым и мощным.

...