2

Dynamic Bindingin javaの利点を知りたいです。

public class Animal {
    public String type = "mammal";

    public void show() {
        System.out.println("The animal is a: " + type);
    }
}
public class Dog extends Animal {  
    public String type;   

    public Dog(String type){  
        this.type = type;  
    }  

    public void show() {  
        System.out.println("The dog is a: " + type);  
    }  
}  

    public static void main(String[] args) {
        Animal doggie = new Dog("daschund");
        doggie.show(); // "The dog is a: daschund"  (dynamic binding)
        System.out.println("The type is: " + doggie.type); //"The type is: mammal" (static binding)
    }

継承戦略だと思います。しかし、Dynamic Binding のように呼び出す人もいます。だからこそ、何がおかしいのだろうと思います。

4

3 に答える 3

2

その利点は、実際の正確な型を知らなくても、呼び出したオブジェクトの型に動作がバインドされることです。たとえば、動物が渡された場合、それが猫か犬かその他の動物かはわかりませんが、関係なく適切な動作を採用します。

例えば

public void makeNoise(List<Animal> animals) {
   for (Animal a : animals) {
      a.makeNoise();
   }
}

上記は、上記のコレクションの各動物に対して適切に吠えたり、鳴いたり、出血したりします。

私はあなたに何かを渡すことができ、それが必要な Animal インターフェースに準拠していれば、後の段階で新しい動物を導入した場合でも、コードは引き続き機能します。コードは、吠えるメカニズムを知る必要はありませんDog。適切な方法でその動作を指示するだけです。

Animal注:上記の例は、抽象クラスを作成することでより明確になると思います。そうすれば、あなたの振る舞いは主に派生した具象クラスから得られます。

于 2012-09-24T16:02:09.303 に答える
0

継承とポリモーフィズムの簡単な例を挙げました。クラスはそのメソッドをオーバーライドしてDog拡張されます。これは、呼び出される具体的な実装が実行時に決定され、具体的な動物の種類に依存することを意味します。Animalshow()show()

これにより、プログラマーはインターフェースを介して具体的な実装に依存しないロジックを作成できます。あなたの場合DogCatさまざまな実装を提供できますshow()が、呼び出し元はshow()具体的な動物の種類を知らなくても使用できます。

于 2012-09-24T16:08:07.080 に答える
0
  1. Java の静的バインディングはコンパイル時に発生し、動的バインディングは実行時に発生します。
  2. プライベート、最終、および静的メソッドと変数は静的バインディングを使用し、コンパイラによって結合されますが、仮想メソッドは実行時オブジェクトに基づいて実行時に結合されます。
  3. 静的バインディングはバインディングに Type (Java のクラス) 情報を使用しますが、動的バインディングは Object を使用してバインディングを解決します。
  4. オーバーロードされたメソッドは静的バインディングを使用して結合されますが、オーバーライドされたメソッドはコンパイル時に結合されます。
于 2012-09-24T16:06:41.320 に答える