実行時 メソッドの探索に使われる実引数の型について
次の2つの考えが正しいかどうかを教えてください。
- 実行時にメソッドの探索がおこなわれるとき 実引数と仮引数の比較は、代入されたインスタンスのクラス ではなく 実引数の型を比較する。
- 実引数は コンパイル時に 探索されて見つかったメソッドの仮引数の型に 暗黙的にキャストされる。
そう考えた根拠が次の実験です。
class Super {
public void method(Object o) {
System.out.println("(class)Super--(arg)Object");
}
}
class Sub extends Super {
public void method(Object o) {
System.out.println("(class)Sub--(arg)Object");
}
public void method(String s) {
System.out.println("(class)Sub--(arg)String--");
}
}
class Test {
public static void main(String[] args) {
Super sp = new Sub();
String str = "";
sp.method(str);
}
}
(class)Sub--(arg)Object
処理の流れは次のようになっていると考えました。
- コンパイル時 変数
sp
の型のクラスからメソッドを探す。 - Superクラスでマッチするメソッドが見つかる。
- 実引数の型は
String
だが コンパイル時点で 仮引数の型Object
にキャストされる - 実行時 メソッドが変数
sp
中のインスタンスのクラスから探索される Sub
クラスでメソッド名がマッチするメソッドが二つ見つかる- 実引数に代入されたインスタンスではなく 実引数の型を仮引数の型と比較する。
- このとき 実引数の型は
Object
にキャストされているので メソッドはmethod(Object o)
が選ばれる
という認識です。あっているでしょうか。
よろしくお願いいたします。