2012-09-24 52 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()