动态方法调度只是为了减少编译时间



我是JAVA的新手,在学习时遇到了动态方法调度,这个例子让我很困惑

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时,我没有得到令人满意的解释。我只是知道它是后期绑定,但不是早期绑定,仅此而已。所以它只是在编译过程中用来转义,或者还有其他东西。有什么简单的例子可以理解这种好处吗。

这通常被称为动态绑定。它提供多态性行为(多态性是一个面向对象的概念(。

在Java中,动态绑定是根据对象的实际类型进行的。这意味着,无论对象的声明类型如何,调用的方法体都将是在用于构造它的类(运行时类(中声明的方法体。这是与new一起使用的类。

当您分配r = a并调用r.callme()时,Java(在运行时(将看到变量r指向的对象的类是A,因此将运行类A提供的callme()的实现。同样,当您重新分配r = b并调用r.callme()时,Java将看到对象的类是B,并将运行B.callme

关于"为什么"部分,Java教程中有以下内容:

多态性的字典定义是指生物学中的一个原则,在这个原则中,一个生物体或物种可以有许多不同的形式或阶段。这一原理也可以应用于面向对象编程和Java语言等语言类的子类可以定义自己独特的行为,但也可以共享父类的一些相同功能

最新更新