2012-05-06 46 views
4

當一個子類覆蓋多種方法和它的父類調用的方法,並在父類中使用它自己的預先定義的方法,或者說孩子已經覆蓋了的呢?父類在子類中覆蓋其中一個方法時如何工作?

對於一些上下文,例如,我的問題從AP計算機科學課程這個問題造成的。下面,當super.act()被調用時,從Dogact方法調用eat()。請問eat調用DogUnderDdog中的eat方法嗎?

考慮以下兩類。

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

有兩種方法子類可以調用父類方法:

  • 呼叫在超作爲自己定義的方法,或
  • 調用方法超類中定義明確要求超類的行爲

用於第一方式的語法如下:

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該方法的重寫的方法時。

相關問題