34
class A {
   boolean f(A a) { return true; }
}
class B extends A {
   boolean f(A a) { return false; } // override A.f(A)
   boolean f(B b) { return true; }  // overload A.f
}

void f() {  
   A a = new A();
   A ab = new B();
   B b = new B();
   ab.f(a); ab.f(ab); ab.f(b); //(1) false, false, *false*
   b.f(a); b.f(ab); b.f(b);    //(2) false, false, true
}

最初の行の最後の誤った出力について説明していただけますか、なぜそれが正しくないのですか?

4

4 に答える 4

60

最初の行の最後の誤った出力について説明していただけますか、なぜそれが正しくないのですか?

のコンパイル時タイプabAであるため、コンパイラ(オーバーロード解決を実行するもの)は、有効なメソッドシグネチャが唯一であると判断し、f(A a)それを呼び出します。

実行時に、そのメソッドシグネチャはそれをオーバーライドするB.f(A a)ために実行されます。B

シグニチャはコンパイル時に選択されますが(オーバーロード)、実装は実行時に選択される(オーバーライド)ことを常に忘れないでください。

于 2012-07-24T06:12:03.950 に答える
1

ええと..Aのタイプを呼び出しているので。したがって、f(A a)のバージョンのみを呼び出すことができます。それはBでfalseを返します。

于 2012-07-24T06:13:18.877 に答える
1

Aのオブジェクトタイプを使用しているため、f(AA)のみを呼び出すことができます。Bがそれを上書きするからです。

于 2012-07-24T06:14:53.573 に答える
0

最初の行の最後の誤った出力について説明していただけますか、なぜそれが正しくないのですか?

そうでなければ考える:-

以下のクラスB(オーバーライドコード)でコメントしてみてください

boolean f(A a) { return false; } // override A.f(A)

このメソッドのクラスAにsysoを追加します->boolean f(A a){....}

次に、クラスAのメソッドのみを表示するab.f(A a)か、ab.f(B b)呼び出します。f(A a)

abはタイプAです。

また、注意してください-オブジェクトabからクラスBのメソッドを呼び出すこともできなくなります。

これにより、上記のすばらしい回答がさらに明確になることを願っています。

最後に、今すぐこれを探すことができます-> Javaで子オブジェクトに親参照を割り当てるのはなぜですか?

于 2017-05-04T08:12:34.160 に答える