我是JAVA的新手,在学习期间遇到了Dynamic Method Dispatch,这个示例使我感到困惑
class A {
void callme() {
System.out.println("Inside A's callme method");
}
}
class B extends A {
// override callme()
void callme() {
System.out.println("Inside B's callme method");
}
}
class C extends A {
// override callme()
void callme() {
System.out.println("Inside C's callme method");
}
}
class Dispatch {
public static void main(String args[]) {
A a = new A(); // object of type A
B b = new B(); // object of type B
C c = new C(); // object of type C
A r; // obtain a reference of type A
r = a; // r refers to an A object
r.callme(); // calls A's version of callme
r = b; // r refers to a B object
r.callme(); // calls B's version of callme
r = c; // r refers to a C object
r.callme(); // calls C's version of callme
}
}
如果我只是这样做
a.callme();
b.callme();
c.callme();
我得到相同的结果。 当我通过谷歌搜索了解DMD时,没有得到满意的解释。我只知道这是后期绑定,但不是早期绑定,仅此而已。因此,它仅用于在编译过程中进行转义或其他操作。有没有简单的例子可以了解其好处。
答案 0 :(得分:2)
这通常称为动态绑定。它提供了多态行为(多态是一个OOP概念)。
在Java中,动态绑定是根据对象的实际类型完成的。这意味着无论对象的声明的类型如何,被调用的方法体都是在用于构造该对象的类(运行时类)中声明的方法。这是使用new
的类。
当您分配r = a
并调用r.callme()
时,Java(在运行时)将看到变量r
指向的对象的类为A
,因此将运行类callme()
提供的A
的实现。
同样,当您重新分配r = b
并调用r.callme()
时,Java将看到该对象的类为B
并运行B.callme
。
关于“为什么”部分,Java tutorial的状态为:
多态性的字典定义是指生物学中的一种原理,其中生物或物种可以具有许多不同的形式或阶段。该原理也可以应用于面向对象的编程和Java语言之类的语言。 一个类的子类可以定义自己的独特行为,但可以共享父类的某些相同功能。