実行時 メソッドの探索に使われる実引数の型について
次の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)が選ばれる
という認識です。あっているでしょうか。
よろしくお願いいたします。