7

次のクラスがあるとします

class A{
    public method(A a) {
        System.out.println(3);
    }
}

class B extends A{
  public void method (A a) {
        System.out.println(2);
  }
  public void method (B b) {
        System.out.println(1);
  }
}

A obj = new B();
obj.method( (B) obj);
((B) obj).method( (B) obj);

最初のメソッド呼び出しは 2 を出力し、2 番目のメソッド呼び出しは 1 を出力します。なぜ両方のメソッド呼び出しが 1 を出力しないのでしょうか?

4

3 に答える 3

4

void method (B b)Bの親Aは完全に不明です。

論理的です。なぜならobj.method((B) obj);、のタイプはAであり、ポリモーフィズムのルールでは、クラスBのバージョンをobj呼び出すことができるから です。void method(A a)

class B extends A {

    // This is an overridden method visible to A
    public void method(A a) {
        System.out.println(2);
    }

    // This is an overloaded method unknown from A
    public void method(B b) {
        System.out.println(1);
    }
}

オーバーライドとオーバーロードについて説明したこのSOの回答を読むことができます。

于 2013-02-25T08:37:41.177 に答える
3

Java はコンパイル時に呼び出すメソッドを選択するためです。また、コンパイラは代入の「左側」のみを考慮します。

したがって、タイプA obj = new B()すると、コンパイラは class のメソッドのみを「認識」しますA

于 2013-02-25T08:30:24.150 に答える
1

最初のメソッド呼び出しはタイプAのオブジェクト参照を使用して行われるため、オーバーライドされる可能性のある対応するメソッドが呼び出されます。

2番目のケースでは、最初にキャストがタイプBに対して行われるため、クラスBで定義された対応するメソッド、つまり、

method (B b)

と呼ばれます。

于 2013-02-25T08:38:57.693 に答える