これは純粋に理論的な質問です。
3 つの単純なクラスが与えられた場合:
class Base {
}
class Sub extends Base {
}
class SubSub extends Sub {
}
そして、これらのクラスを操作するための関数:
public static void doSomething(Base b) {
System.out.println("BASE CALLED");
}
public static void doSomething(Sub b) {
System.out.println("SUB CALLED");
}
次のコードのようです:
SubSub ss = new SubSub();
doSomething(ss);
SubSub はこれらの両方にキャストできるため、正当に BASE CALLED または SUB CALLED のいずれかを出力する可能性があります。実際、関数の Sub バージョンを削除すると、BASE CALLED が出力されます。実際に起こることは、「SUB CALLED」が出力されることです。これは、Base バージョンが最初に呼び出されたため、どの関数が呼び出されるかは、関数が定義されている順序に依存しないことを意味しているようです。
Java は、関数のさまざまなバージョンをすべて調べて、継承スタックのトラバーサルが最も少ないバージョンを選択するだけですか? これは標準化されていますか?ドキュメントに記載されていますか?