「低レベル」の定義を探している場合、おそらく唯一の正当な情報源は、古くからの友人である JLS です。この場合、明確な定義はありませんが、各用語を使用するコンテキストで十分かもしれません。
急送
この用語は、呼び出すメソッドを決定する手順で実際に言及されています。
15.12.2. コンパイル時のステップ 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());
}
}
出力:
sx=0
sx=1
フィールドは「事前バインディング」を使用し、インスタンス メソッドは「遅延バインディング」を使用することを示します。
このフィールド アクセスの動的ルックアップの欠如により、プログラムを簡単な実装で効率的に実行できます。レイト バインディングとオーバーライドの機能を利用できますが、それはインスタンス メソッドが使用されている場合のみです。
バインディングは、ジェネリックの型の決定に関しても使用されます。
8. クラス
クラスはジェネリック(§8.1.2) である場合があります。つまり、クラスの異なるインスタンス間でバインディングが異なる可能性がある型変数を宣言する場合があります。
List<String>
の 2 つのインスタンスを作成すると、両方のインスタンスの のバインディングString
が互いに異なることを意味します。
これは raw タイプにも適用されます。
4.8. 生の型
class Outer<T>{
T t;
class Inner {
T setOuterT(T t1) { t = t1; return t; }
}
}
Inner のメンバーの型は、Outer の型パラメーターによって異なります。Outer が raw の場合、T の有効なバインドがないため、Inner も raw として処理する必要があります。
つまり、宣言Outer outer
(これは生の型の警告を生成します) では型を判別できませんT
(明らかに、宣言では定義されていません)。