次の2つの考えが正しいかどうかを教えてください。

  1. 実行時にメソッドの探索がおこなわれるとき 実引数と仮引数の比較は、代入されたインスタンスのクラス ではなく 実引数の型を比較する。
  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

処理の流れは次のようになっていると考えました。

  1. コンパイル時 変数spの型のクラスからメソッドを探す。
  2. Superクラスでマッチするメソッドが見つかる。
  3. 実引数の型はStringだが コンパイル時点で 仮引数の型Objectにキャストされる
  4. 実行時 メソッドが変数sp中のインスタンスのクラスから探索される
  5. Subクラスでメソッド名がマッチするメソッドが二つ見つかる
  6. 実引数に代入されたインスタンスではなく 実引数の型を仮引数の型と比較する。
  7. このとき 実引数の型はObjectにキャストされているので メソッドはmethod(Object o)が選ばれる

という認識です。あっているでしょうか。
よろしくお願いいたします。