2012-09-24 178 views
2

我想知道在java中Dynamic Binding的優點。動態綁定

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) 
    } 

我想,這是一種繼承策略。但有些人稱之爲動態綁定。這就是爲什麼,我假設它會有什麼奇怪的。

+2

相比什麼優勢? – Keppil

+0

@Keppil:與「靜態綁定」相比。 (請參閱OP的源代碼中的最後一條評論。)繼承的實例方法被覆蓋,所以調用'doggie.show()'調用'Dog.show',它打印'Dog.type' - 「動態綁定「 - 而字段不會被覆蓋,所以'doggie.type'的使用使用'Animal.type' - 」靜態綁定「。 – ruakh

+0

@ruakh:啊,'靜態綁定'部分是不可見的,我的壞。 – Keppil

回答

2

好處它是你的行爲綁定到你調用它的對象的類型,而你不知道它實際是什麼類型。例如如果你通過一個動物,你不知道它是否是貓/狗/無論如何,但它會採取適當的行爲,無論。

例如

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

以上將針對上述集合中的每隻動物適當地叫聲,喵喵聲,bleet等。

我可以傳給你的東西,並提供它符合要求的Animal接口,你的代碼會繼續,如果/當我在後面的階段引入新動物的工作。你的代碼不需要知道如何吠叫的機制 - 只要你通過適當的方法指示這種行爲即可。

注:我認爲你的例子會更清晰,使Animal成爲一個抽象類。這樣你的行爲將主要來自派生的具體類。

+0

我認爲,這是一種「繼承」策略。但有些人稱之爲「動態綁定」。這就是爲什麼,我假設它會有什麼奇怪的。 – CycDemo

0
  1. Java中的靜態綁定發生在編譯期間,而運行時發生動態 綁定。
  2. 私人,最後和靜態方法和變量使用靜態 結合和由編譯器接合而虛擬方法基於運行時對象在運行期間接合 。
  3. 靜態綁定使用Type(Class in Java)信息綁定 ,而動態綁定使用Object來解析綁定。
  4. 重載方法使用靜態綁定綁定,而在編譯期間綁定 重寫的方法。
0

你給了繼承和多態的一個簡單的例子。類別Dog延伸Animal覆蓋其方法show()。這意味着調用show()的具體實現是在運行時確定的,並且取決於具體的動物類型。

這允許程序員通過接口創建不依賴具體實現的邏輯。在你的情況下,DogCat可以提供show()的不同實現,但它可以在不知道具體動物類型的情況下使用show()