Java 什么是动态方法分派,它与继承有什么关系?

Java 什么是动态方法分派,它与继承有什么关系?,java,Java,Java中的动态分派是什么意思?为什么在继承上下文中需要它 Java[…]中的动态调度是什么意思? 将“分派”视为“决定调用哪个方法” “动态”部分只是说它是在运行时确定的。也就是说,调用哪个方法是在运行时确定的 为什么我们在继承的背景下需要它 如果没有继承/多态性,我们就不需要这个。表达式的类型在编译时是可判定的,并且在编译程序时会知道在运行时调用的方法 对于继承/多态性,我们不知道表达式的具体运行时类型,因此必须在运行时“动态”确定要调用的方法 没有动态分派,虚拟方法就没有意义,因为虚拟方法

Java中的动态分派是什么意思?为什么在继承上下文中需要它

Java[…]中的动态调度是什么意思?

将“分派”视为“决定调用哪个方法”

“动态”部分只是说它是在运行时确定的。也就是说,调用哪个方法是在运行时确定的

为什么我们在继承的背景下需要它

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

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

没有动态分派,虚拟方法就没有意义,因为虚拟方法是抽象和封装的核心

建议阅读:

java中的动态方法调度是什么

和其他语言一样。根据调用该方法的对象的类型动态地分派给所选的方法

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

那是你唯一需要它的时候。如果你没有继承权,那么就没有什么动态可言

<>在Java中C++中的哪一个多态性最好,或者在java中使用DMD。p>
这个问题毫无意义,因为它们没有什么不同。DMD是实现多态性的一个方面的机制。

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

假设您有一个类“矩形”

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();
  }
...
}
如果此方法的参数是矩形类,则它将绘制

___
| |
---
但当参数的类型为RoundedRectangle时,我们期望:

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

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

所以后期绑定意味着:对一个实例调用给定签名(方法名和参数列表)的方法,该实例只知道它是一个特定的类或子类,但不知道它到底是哪个类。当一个方法被重写时,则调用重写方法


所以没有多态性和后期绑定——当您有多态性时,您需要后期绑定。在java和C++中(我相信,在其他所有面向对象语言中)

可以请分享一些例子来解释这个点<代码>继承/多态性,我们不知道表达式的具体运行时类型,因此调用哪个方法必须是动态的。在运行时确定。非常简单:如果不允许您执行
List l=new ArrayList()但必须执行
ArrayList l=new ArrayList()
您不需要动态分派,因为运行时
l
的类型必然是
ArrayList
(也就是说,它不能是任何其他
列表
)。这将使动态分派变得毫无意义,因为编译器可以将对
l.add(…)
的调用硬连接到
ArrayList.add
方法(而不是将其连接到
List.add
并将其分派到
ArrayList.add
LinkedList.add
动态)。现在就知道了。据我所知,动态调度有两种形式<代码>单次
双次/多次
调度。请你也分享一些关于这些的信息好吗。最好是一个小例子。单一分派:您根据单个输入选择方法,例如对象类型。多重分派:您的选择基于多个输入,例如对象类型和参数类型。在Java中,您可以根据提供的参数类型调用不同的方法(方法重载),但这种机制完全在编译时工作。所以对于多个分派,假设这是在运行时决定的:
objecto=“hello”;m(o)
对象o=新整数(5);m(o)可以调用不同的方法。啊,在java中,两个方法调用将调用相同的方法
m
,因为两个
o
s都是
对象类型。如果它支持
multiple dispatch
,它应该调用两种不同的方法。非常感谢你清理了那篇文章。但无论如何,Java不支持多分派。你知道为什么吗?拉尔夫这个答案很好!!!请举例说明一下
单次调度
双次/多次调度