2013-03-09 126 views
-1

這是一個奇怪的措詞問題,所以我很抱歉,如果它是重複的。使用重寫的子類方法的超類方法

說我有一類foo與方法a調用方法b

public class foo 
{ 
    public void a() 
    { 
     b(); 
    } 

    public void b() 
    { 
     gamma(); 
    } 
} 

現在我有一個擴展foo

public class bar extends foo 
{ 
    @Override 
    public void b() 
    { 
     theta(); 
    } 
} 

如果我叫bar.a()一個子類bar,將a使用來自超類的b方法還是來自子類的b方法?也就是說,bar.b()最終會執行gamma還是最終會執行theta

+5

詢問沒有問題,但是由於您已經編寫了代碼,您可以通過記錄或直接將其寫入控制檯來自行檢查。我總是樂於做這樣的實驗,以確定會發生什麼 - 這種方式有時候可以找到新的方法來做某些事情,而這些事情你現在可能並沒有縮進,但是稍後你會發現已經做到了。你有時可能會重新發明輪子,但是有好奇心,並且自己做所有的小事情你不僅僅是得到答案 – Wolfii 2013-03-09 20:47:26

回答

1

它將使用子類中的方法b。這是壓倒一切的方法。擴展其父項的子類可以自由創建方法的更具體的實現。當在sublcass上調用重寫的方法時,它的專用方法將被用來代替超類的方法。

0

f我打電話給bar.a(),會使用超類中的b方法還是使用子類中的b 方法?也就是說,bar.b()會執行gamma 還是最終會執行theta?

它將使用bar.b()方法。這是dynamic dispatch的結果。

相關問題