什么是动态方法调度以及它与inheritance的关系?
Java中的动态分派是什么意思,为什么我们在inheritance的上下文中需要它?
Java […]中的动态调度是什么意思?
将“发送”视为“确定调用哪种方法”。
“动态”部分简单地说它是在运行时确定的。 也就是说,在运行时确定要调用的方法。
为什么我们在inheritance的背景下需要它
没有inheritance/多态,我们就不需要这个。 表达式的类型在编译时是可判定的,并且在编译程序时将知道在运行时调用的方法。
对于inheritance/多态,我们不知道表达式的具体运行时类型,因此必须在运行时“动态”确定要调用的方法。
如果没有动态调度,虚拟方法就没有意义,这对于抽象和封装来说是至关重要的。
推荐阅读: 关于动态调度的维基百科文章
其他答案讨论了这个理论,这是一个例子,说明为什么需要动态调度(也称为后期绑定)。
假设你有一个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 ++中(我相信,在其他所有面向对象的语言中)
什么是java的动态方法调度
与任何其他语言相同。 动态调度到根据调用该方法的对象类型选择的方法。
为什么在inheritance的情况下我们需要它(DMD的需要是什么)
这是你唯一需要它的时间。 如果你没有inheritance,就没有任何动态。
哪一个是更好的C ++中的多态性或java中的DMD。
这个问题毫无意义,因为它们并没有什么不同。 DMD是实现多态性的一个方面的机制。
- Android中的序列化
- 来自File Provider Uri的Android 7.0 Notification Sound无法播放
- 如何在Java中同时执行多个进程?
- Android SOAP wsdl
- 无法打开数据库/无法将(数据库)的区域设置更改为“en_US”
- 为什么Microsoft SQL Server 2012查询需要花费几分钟而不是JDBC 4.0,而在Management Studio中需要几秒钟?
- 如何在Zxing Scanner Camera View中添加按钮
- 从Android设备获取.mp3格式的文件
- 如何使用Google API Client Library for Java检索youtube缩略图