Ответ 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.
}
Двойная отправка - это комбинация статических и временных (также называемых динамических) рассылок.