2012-05-06 17 views
4

子クラスが複数のメソッドをオーバーライドしてその親クラスのメソッドを呼び出す場合、親クラスはそれ自身の事前定義されたメソッドを使用するか、またはその子がオーバーライドしたメソッドを使用しますか?子クラスでメソッドの1つがオーバーライドされた場合、親クラスはどのように機能しますか?

私の質問は、APコンピュータサイエンスカリキュラムのこの質問に由来しています。以下、super.act()が呼び出された場合、メソッドはDogからeat()となります。そのeatコールはeatメソッドDogまたはUnderDdogに行くか?

次の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. 何が原因無限再帰に印刷されません。
+3

試してみるとどうなりますか? –

答えて

3

サブクラスがスーパークラスのメソッドを呼び出すことができる2つの方法があります。

  • コール自身のようスーパークラスで定義する方法、または
  • 特に、スーパークラスの振る舞いを要求するスーパークラスで定義されたメソッドを呼び出すには、

次のように最初の方法のための構文は次のとおりです。

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

次のように呼び出しの第二の方法のための構文は次のとおりです。

super.act(); 

は、私は今あなたがさらに助けを借りずに自分の例では何が起こるかを追跡するのに十分な情報を持っていると思います。

+0

いいえ、私が知りたいのは、super.act()が呼び出されたときにeat()を呼び出すことです。それは犬の犬の下で、または犬の下で食べる方法を呼び出す食べるのですか?なぜ? – GBleaney

+0

@ user577829 'Dog'が' eat'を呼び出すと、それは暗黙の 'this.eat()'であり、 'this'はすべてのメソッドを持つ' UnderDog'のインスタンスなので、サブクラスで定義されたものを呼び出します。 – dasblinkenlight

+0

そのコードはDogから来ていますが、UnderDog内で定義されているメソッドのように実行されますか? – GBleaney

0

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

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

関連する問題