Когда вы ищете определения «низкого уровня», вероятно, единственным законным источником является наш старый друг — JLS. Хотя в данном случае он не дает четкого определения, контекста, в котором используется каждый термин, может быть достаточно.
Отправлять
Этот термин действительно упоминается в процедурах определения того, какой метод вызывать.
15.12.2. Шаг 2 во время компиляции: определение подписи метода
На втором этапе выполняется поиск методов-членов в типе, определенном на предыдущем шаге. На этом шаге имя метода и выражения аргументов используются для поиска методов, которые являются как доступными, так и применимыми, то есть объявлениями, которые могут быть правильно вызваны для заданных аргументов.
Таких методов может быть несколько, и в этом случае выбирается наиболее конкретный. Дескриптор (сигнатура плюс тип возвращаемого значения) наиболее конкретного метода — это тот, который используется во время выполнения для выполнения отправки метода. Метод применим, если он применим одним из строгих вызовов
Подробная информация о том, какой метод является «наиболее конкретным», приведена в разделе 15.12.2.5 «Выбор наиболее конкретного метода».
Что касается "динамической отправки",
JLS 12.5. Создание новых экземпляров класса:
В отличие от C++, язык программирования Java не определяет измененных правил диспетчеризации методов при создании нового экземпляра класса. Если вызываются методы, которые переопределяются в подклассах инициализируемого объекта, то эти переопределяющие методы используются даже до того, как новый объект будет полностью инициализирован.
Оно включает
Пример 12.5-2. Динамическая отправка во время создания экземпляра
class Super {
Super() {
printThree();
}
void printThree() {
System.out.println("three");
}
}
class Test extends Super {
int three = 3;
void printThree() {
System.out.println(three);
}
public static void main(String[] args) {
Test t = new Test();
t.printThree();
}
}
Выход:
0
3
Это происходит потому, что во время цепочки вызовов конструктора конструктор Super вызывает printThree, но из-за динамической диспетчеризации вызывается метод в Test, и это происходит до инициализации поля.
Связывание
Этот термин используется в контексте доступа к членам класса.
Пример 15.11.1-1. Статическая привязка для доступа к полям демонстрирует раннее и позднее связывание. Обобщу приведенные там примеры для ленивых из нас:
class S {
int x = 0;
int z() { return x; }
}
class T extends S {
int x = 1;
int z() { return x; }
}
public class Test1 {
public static void main(String[] args) {
S s = new T();
System.out.println("s.x=" + s.x);
System.out.println("s.x=" + s.z());
}
}
Выход:
s.x=0
s.x=1
Показано, что поле использует «раннее связывание», а метод экземпляра использует «позднее связывание»:
Это отсутствие динамического поиска для доступа к полям позволяет эффективно запускать программы с помощью простых реализаций. Возможности позднего связывания и переопределения доступны, но только при использовании методов экземпляра.
Связывание также используется для определения типа универсального,
8. Классы
Классы могут быть универсальными (§8.1.2), то есть они могут объявлять переменные типа, привязки которых могут различаться в разных экземплярах класса.
Это означает, что если вы создадите 2 экземпляра List<String>, привязки String в обоих экземплярах будут отличаться друг от друга.
Это также относится к необработанным типам:
4.8. Необработанные типы
class Outer<T>{
T t;
class Inner {
T setOuterT(T t1) { t = t1; return t; }
}
}
Тип членов Inner зависит от параметра типа Outer. Если Outer является необработанным, Inner также должен рассматриваться как необработанный, поскольку для T нет допустимой привязки.
Это означает, что объявление Outer outer (это вызовет предупреждение о необработанном типе) не позволяет определить тип T (очевидно - он не был определен в объявлении).
person
user1803551
schedule
07.01.2017