2

我想知道Dynamic Bindingjava的优势。

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

我认为,这是一种继承策略。但是有些人称之为动态绑定。这就是为什么,我认为其中会有什么奇怪的地方。

4

3 回答 3

2

它的好处是你的行为与你调用它的对象的类型绑定在一起,而你不知道它实际上是什么精确的类型。例如,如果你传递了一个动物,你不知道它是不是猫/狗/什么,但无论如何它都会采取适当的行为。

例如

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

以上将针对上述集合中的每只动物进行适当的吠叫、喵叫、叫声等。

我可以向您传递一些东西,并提供它符合所需的动物接口,如果/当我在稍后阶段引入新动物时,您的代码将继续工作。您的代码不需要知道Dog吠叫的机制——只需通过适当的方法指示该行为即可。

注意:我认为通过创建Animal一个抽象类,您上面的示例会更清楚。这样,您的行为将主要来自派生的具体类。

于 2012-09-24T16:02:09.303 回答
0
  1. Java 中的静态绑定发生在编译时,而动态绑定发生在运行时。
  2. 私有、最终和静态方法和变量使用静态绑定并由编译器绑定,而虚拟方法在运行时根据运行时对象绑定。
  3. 静态绑定使用类型(Java 中的类)信息进行绑定,而动态绑定使用对象来解析绑定。
  4. 重载的方法使用静态绑定进行绑定,而重写的方法在编译时进行绑定。
于 2012-09-24T16:06:41.320 回答
0

你举了一个简单的继承和多态的例子。类Dog扩展Animal覆盖其方法show()。这意味着show()被调用的具体实现是在运行时确定的,并且取决于具体的动物类型。

这允许程序员通过接口创建不依赖于具体实现的逻辑。在您的情况下DogCat可以提供不同的实现,show()但调用者可以show()在不知道具体动物类型的情况下使用它。

于 2012-09-24T16:08:07.080 回答