左と右のオブジェクトは、評価/実行時またはコンパイル時中に解決されますか?

ティムDaiu:

本の運動を参照すると、...

以下のコードを有します。..

Left left = createLeftInstance ();
Right right = createRightInstance ();

...との両方の上述の方法は、Javaで次のメソッドの呼び出しを左と右のすべてのサブクラスのインスタンスを返すことができることを考慮して維持します...

left.invoke (right);

どのように解決されます。

  • 右の左とコンパイル時の実行時の型に基づかA)
  • B)右の左とランタイムのコンパイル時の型に基づか
  • 右の左とコンパイル時のコンパイル時の型に基づかC)
  • ランタイム左のタイプ、右の実行時に基づかD)
peter.petrov:

A)は、ここで正解です。

次のコードはそれを示しています。

    public class Main001 {

        public static void main(String[] args) {
            A right = createRightInstance();
            B left = createLeftInstance();

            left.invoke(right);
            System.out.println("Done!!!");
        }

        public static B createLeftInstance() {
            return new B2();
        }

        public static A createRightInstance() {
            return new A2();
        }

    }

    class A{

    }

    class A1 extends A{

    }

    class A2 extends A1{

    }

    class B{
        public void invoke(A x) {
            System.out.println("Invoking method A on B with argument " + x.getClass().getName());
        }
        public void invoke(A1 x) {
            System.out.println("Invoking method A1 on B with argument " + x.getClass().getName());
        }
        public void invoke(A2 x) {
            System.out.println("Invoking method A2 on B with argument " + x.getClass().getName());
        }
    }

    class B1 extends B{
        public void invoke(A x) {
            System.out.println("Invoking method A on B1 with argument " + x.getClass().getName());
        }
        public void invoke(A1 x) {
            System.out.println("Invoking method A1 on B1 with argument " + x.getClass().getName());
        }
        public void invoke(A2 x) {
            System.out.println("Invoking method A2 on B1 with argument " + x.getClass().getName());
        }

    }

    class B2 extends B1{
        public void invoke(A x) {
            System.out.println("Invoking method A on B2 with argument " + x.getClass().getName());
        }
        public void invoke(A1 x) {
            System.out.println("Invoking method A1 on B2 with argument " + x.getClass().getName());
        }
        public void invoke(A2 x) {
            System.out.println("Invoking method A2 on B2 with argument " + x.getClass().getName());
        }
    }

この例を印刷

Invoking method A on B2 with argument A2
Done!!!

その手段A)正解です。

なぜそれはそれを意味するのでしょうか?

まあ...ので:
1)B2クラスからメソッドが呼び出された(出力が言うように)、B2はの実行時の型ですleft(のコンパイル時の型がleftBです)。
パラメータAと2)の方法は、Aは、のコンパイル時の型であること(注呼び出されるrightのランタイム型があっても、)rightA2です。コンパイル時の型がrightどのとちょうどタイプであるrightのすなわちA.実行時の型が宣言されているrightA2すなわち、引数の実際の型である(出力を参照してください、それは言うwith argument A2が)。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=188611&siteId=1