2

「ポリモーフィズム」の章の「Thinking in Java」で「Late binding」の概念について読みましたが、この概念についての私の理解が正しいかどうか知りたいだけです

手続き型言語は、たとえば、実行前に実行する関数がどこにあるかを知っています

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

したがって、可能な各関数のアドレスは、プログラムが実行される前に正確にわかっているため、簡単にコンパイルできますが、OOL ではこのコードを調べます。

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

a は dog 、 cat またはその他の Animal タイプである可能性があり、実行時にオブジェクトを初期化するため、実行時に speak を実行する引数を渡す必要があるため、これは実行時に発生する遅延バインディングです。 -時間 ....

本当 ??

4

4 に答える 4

4

はい、仮想メソッド テーブルを使用して実装されています。

あなたの例speak()では、物理アドレスを持たない仮想 (抽象) メソッドです。ランタイムは、具体的なサブクラスの型に基づいて、仮想メソッド テーブルを参照することによりAnimal、どの実装speak()を呼び出すかを決定します。

于 2010-10-01T02:14:42.960 に答える
2

はい。例えば、

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 です。

このルールの落とし穴は、コンパイル時にバインドされる静的メソッドなので、気をつけてください。

于 2010-10-01T02:15:45.410 に答える
1

はい。それで合っています。あなたが与えた例では、speak()呼び出される正しいものは、実行時に認識されるオブジェクトのタイプによって異なります。メソッドをfinalとして宣言した場合にのみ、事前バインディングが適用されます。

于 2010-10-01T02:18:19.043 に答える
0

はい、正解です。これにより、コードがより拡張可能で強力になります。

于 2010-10-01T02:20:41.740 に答える