4

子クラスが複数のメソッドをオーバーライドし、その親クラスのメソッドを呼び出す場合、親クラスは独自の定義済みメソッドを使用しますか?それとも子クラスがオーバーライドしたメソッドを使用しますか?

いくつかのコンテキストと例として、私の質問は AP コンピューター サイエンス カリキュラムのこの質問に由来しています。以下、super.act()が呼び出されると、 のactメソッドが をDog呼び出しますeat()。その呼び出しは または のメソッドにeat行きますか?eatDogUnderDdog

次の 2 つのクラスを考えてみましょう。

public class Dog
{
    public void act() {
        System.out.print("run");
        eat();
    }

    public void eat() {
        System.out.print("eat");
    }
}

public class UnderDog extends Dog
{
    public void act() {
        super.act();
        System.out.print("sleep");
    }

    public void eat() {
        super.eat();
        System.out.print("bark");
    }
}

次の宣言がクライアント プログラムにあるとします。

Dog fido = new UnderDog();

呼び出しの結果として何が出力されますfido.act()か?

  1. run eat
  2. run eat sleep
  3. run eat sleep bark
  4. run eat bark sleep
  5. 無限再帰のため、何も出力されません。
4

2 に答える 2

3

サブクラスがスーパークラス メソッドを呼び出す方法は 2 つあります。

  • スーパークラスで定義されたメソッドを独自に呼び出す、または
  • スーパークラスの動作を具体的に要求するスーパークラスで定義されたメソッドを呼び出す

最初の方法の構文は次のとおりです。

act(); // it's the same as this.act()

2 番目の呼び出し方法の構文は次のとおりです。

super.act();

これで、例で何が起こっているかを追跡するのに十分な情報が得られたと思います。

于 2012-05-06T23:55:52.183 に答える
0

クラスの階層または他の無関係なクラスで定義されたメソッドが呼び出されるたびに、ポリモーフィズムが開始されます。ターゲットメソッドは、インスタンスの実際のクラスから始まり、継承階層を上に移動するために検索されます。

これがバイパスされるのは、 を使用してそれをオーバーライドするメソッドからオーバーライドされたメソッドを呼び出すときだけsuperです。

于 2012-05-07T00:15:27.573 に答える