什么是动态方法调度以及它与继承的关系?

时间:2010-12-03 07:06:05

标签: java

Java中的动态调度是什么意思,为什么我们在继承的上下文中需要它?

3 个答案:

答案 0 :(得分:12)

  

Java [...]中动态调度的含义是什么?

将“调度”视为“确定调用哪种方法”。

“动态”部分简单地说它是在运行时确定的。也就是说,要在运行时确定要调用的方法。

  

为什么我们在继承环境中需要它

没有继承/多态,我们不需要这个。表达式的类型在编译时是可判定的,并且在编译程序时将知道在运行时调用的方法。

对于继承/多态,我们不知道表达式的具体运行时类型,因此必须在运行时“动态”确定要调用的方法。

如果没有动态调度,虚拟方法就没有意义,这对于抽象和封装至关重要。

推荐阅读:Wikipedia article on Dynamic Dispatch

答案 1 :(得分:11)

其他答案讨论理论,这是一个示例,说明为什么需要动态调度(也称为后期绑定)。

假设你有一个Class'Rectangle`。

public class Rectangle{
  public void draw() {
     System.out.println("___\n| |\n---");
     //does it look nice?
  }
}

你有一个圆角的子类

public class RoundedRectangle extends Rectangle {
  @Override
  public void draw() {
     System.out.println("assume it is a rectangle with rounded corners");
  }
}

现在假设你有一个方法来获取一个Rectangle类型的参数,该方法在方法中用来调用draw方法

public class Demo() {
...
  public demonstration(Rectangle rect) {
    rect.draw();
  }
...
}

这个方法的参数是Rectangle类,然后它将绘制

___
| |
---

但是当参数是RoundedRectangle类型时,我们期望:

assume it is a rectangle with rounded corners

这就是需要后期绑定的地方:当代码编译时,不清楚需要调用哪个方法 rect.draw(); 我可以是Rectangle.draw(),RoundedRectangle.draw(),或任何其他尚未实现的Rectangle子类的draw方法。

摘要(从开发人员的角度来看):

这么晚的绑定意味着:为一个只知道它是特定类或子类的实例调用给定签名的方法(方法名和参数列表) - 但不知道它究竟是哪个类。当一个方法被覆盖时,然后调用覆盖方法。

所以没有多态性与晚期绑定 - 当你有多态性时,你需要晚期绑定。在Java和C ++中(我相信,在其他所有面向对象的语言中)

答案 2 :(得分:1)

  

java

的动态方法调度是什么

与任何其他语言相同。根据调用该方法的对象类型动态调度到所选择的方法。

  

为什么我们在继承的情况下需要它(DMD需要什么)

这是你唯一需要它的时间。如果你没有继承,就没有任何动态了。

  

哪一个是更好的C ++中的多态性或java中的DMD。

这个问题毫无意义,因为它们并没有什么不同。 DMD是实现多态性的一个方面的机制。