动态方法分派只是为了减少编译时间吗?

时间:2018-10-28 19:01:16

标签: java dispatch

我是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时,没有得到满意的解释。我只知道这是后期绑定,但不是早期绑定,仅此而已。因此,它仅用于在编译过程中进行转义或其他操作。有没有简单的例子可以了解其好处。

1 个答案:

答案 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语言之类的语言。 一个类的子类可以定义自己的独特行为,但可以共享父类的某些相同功能。