Является ли Dynamic Method Dispatch только для сокращения времени компиляции - PullRequest
0 голосов
/ 28 октября 2018

Я новичок в 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();

Я получу тот же результат,Когда я читал о МДД, прибегая к помощи, я не получил удовлетворительных объяснений.Я просто понял, что это поздняя привязка, но не ранняя привязка, вот и все.Так что он просто используется для сброса во время компиляции или что-то еще.Есть ли простой пример, чтобы понять преимущества.

1 Ответ

0 голосов
/ 28 октября 2018

Это чаще называют динамическим связыванием.Он обеспечивает полиморфное поведение (полиморфизм является концепцией ООП).

В Java динамическое связывание выполняется на основе фактического типа объекта.Это означает, что независимо от объявленного типа объекта, тело вызванного метода будет тем, которое было объявлено в классе, который использовался для его создания (класс времени выполнения).Это класс, с которым был использован new.

Когда вы присваиваете r = a и вызываете r.callme(), Java (во время выполнения) увидит, что класс объекта это переменная rуказывает на A и, следовательно, будет запускать реализацию callme(), предоставляемую классом A.Аналогично, когда вы переназначаете r = b и вызываете r.callme(), Java увидит, что класс объекта равен B, и запустит B.callme.

Что касается части «почему», то Учебное пособие по Java имеет состояния:

В словарном определении полиморфизма упоминается принцип в биологии, в котором организм или вид могут иметь множество различных форм или стадий.Этот принцип также может быть применен к объектно-ориентированному программированию и таким языкам, как язык Java. Подклассы класса могут определять свое собственное уникальное поведение и, тем не менее, совместно использовать некоторые из тех же функций родительского класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...