Что отправляет в java

Я смущен тем, что такое диспетчеризация. Особенно, когда речь идет о двойной диспетчеризации. Есть ли простой способ понять эту концепцию?

Ответы

Ответ 1

Отправка - это способ, которым язык связывает вызовы с определениями функций/методов.

В java класс может иметь несколько методов с тем же именем, но с разными типами параметров, а язык указывает, что вызовы метода отправляются методу с правильным количеством параметров, которые имеют наиболее конкретные типы, которые могли бы иметь фактические параметры совпадение. Эта статическая отправка.

Например,

void foo(String s) { ... }
void foo(Object o) { ... }
{ foo("");           }  // statically dispatched to foo(String)
{ foo(new Object()); }  // statically dispatched to foo(Object)
{ foo((Object) "");  }  // statically dispatched to foo(Object)

Java также имеет диспетчер виртуальных методов. Подкласс может переопределять метод, объявленный в суперклассе. Поэтому во время выполнения JVM должен отправить вызов метода в версию метода, которая соответствует типу времени выполнения this.

Например,

class Base { void foo() { ... } }
class Derived extends Base { @Override void foo() { ... } }


{ new Derived().foo(); }  // Dynamically dispatched to Derived.foo.
{
  Base x = new Base();
  x.foo();                // Dynamically dispatched to Base.foo.
  x = new Derived();      // x static type is still Base.
  x.foo();                // Dynamically dispatched to Derived.foo.
}

Двойная отправка - это комбинация статических и временных (также называемых динамических) рассылок.