Java 什么是动态方法分派,它与继承有什么关系?
Java中的动态分派是什么意思?为什么在继承上下文中需要它 Java[…]中的动态调度是什么意思? 将“分派”视为“决定调用哪个方法” “动态”部分只是说它是在运行时确定的。也就是说,调用哪个方法是在运行时确定的 为什么我们在继承的背景下需要它 如果没有继承/多态性,我们就不需要这个。表达式的类型在编译时是可判定的,并且在编译程序时会知道在运行时调用的方法 对于继承/多态性,我们不知道表达式的具体运行时类型,因此必须在运行时“动态”确定要调用的方法 没有动态分派,虚拟方法就没有意义,因为虚拟方法是抽象和封装的核心 建议阅读: java中的动态方法调度是什么 和其他语言一样。根据调用该方法的对象的类型动态地分派给所选的方法 在继承的情况下,我们为什么需要它(DMD的需求是什么) 那是你唯一需要它的时候。如果你没有继承权,那么就没有什么动态可言 <>在Java中C++中的哪一个多态性最好,或者在java中使用DMD。p>Java 什么是动态方法分派,它与继承有什么关系?,java,Java,Java中的动态分派是什么意思?为什么在继承上下文中需要它 Java[…]中的动态调度是什么意思? 将“分派”视为“决定调用哪个方法” “动态”部分只是说它是在运行时确定的。也就是说,调用哪个方法是在运行时确定的 为什么我们在继承的背景下需要它 如果没有继承/多态性,我们就不需要这个。表达式的类型在编译时是可判定的,并且在编译程序时会知道在运行时调用的方法 对于继承/多态性,我们不知道表达式的具体运行时类型,因此必须在运行时“动态”确定要调用的方法 没有动态分派,虚拟方法就没有意义,因为虚拟方法
这个问题毫无意义,因为它们没有什么不同。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不支持多分派。你知道为什么吗?拉尔夫这个答案很好!!!请举例说明一下单次调度
和双次/多次调度
。