2011-06-29 55 views
5

我有一個方法,在一個名爲「PlaceParser」那extends「ModelParser」類:Java:覆蓋或重載方法?

protected Place parseModel(JSONObject element) ... 

的地方是一個子類的模型。 應該將@Override註釋添加到上面的代碼中嗎?由於該方法具有不同的返回類型,這仍然算作重寫具有相同名稱和參數的基類方法/返回類型是否會改變'簽名'?

的 「ModelParser」 的方法是這樣的 「ModelT」 也延伸 「模式」:

protected abstract ModelT parseModel(JSONObject element) 
      throws JSONException; 

更新@喬恩飛碟雙向:

的基類聲明如下:

public abstract class ModelParser<ModelT extends Model> { 

我還沒見過之前的一個類的10樣式聲明。

+0

見http://stackoverflow.com/questions/1882584/what-is-a-covariant-return-type。 (不是*完全*您的情況,因爲'Place'不會擴展'ModelT'。) –

+0

@Eli:我懷疑Place實際上是在擴展ModelT,否則這段代碼就不會編譯。 (或者ModelT是泛型類型參數...) –

+0

@Jon:我已經更新了這個問題 - 如果你能解釋'ModelT'和'Place'之間的關係,我將非常感激。 – Mikaveli

回答

6

是的,您應該添加@Override,因爲您仍然覆蓋該方法。您使用返回類型的協變的事實不會改變這一點。

特別是,如果其他代碼有ModelParser類型的表達式,並呼籲parseModel(element)他們最終仍要多態在實現。將其與重載(例如通過添加另一個參數)進行比較,其中將調用ModelParser中的原始實現。

3

OVERLOADING Java和幾種編程語言允許您爲一種以上的方法重用方法名稱。在某些情況下,您可能希望在同一個類中編寫幾個方法,使用不同參數進行基本相同的工作。 當您編寫代碼來調用一個方法時,根據您提供的參數或參數的類型選擇合適的一個。 兩條規則適用於重載方法:

  1. 方法的返回類型可能不同,但重載方法的參數列表必須不同。
  2. 調用語句的參數列表必須有足夠的差異,以便明確確定調用的正確方法。

壓倒性在類層次結構中,當在子類中的方法具有相同的名稱和類型簽名如超類方法,則在子類中的方法被說成覆蓋超類中的方法。 派生類中的方法可以具有與基類相同的名稱。如果您有一個名爲book的基類和名爲book1和book2的派生類,並且如果在所有三個類中都使用相同的方法,則會執行最後一個派生類方法,儘管前面所有類中都有類似名稱的方法。 Java中的概念被稱爲覆蓋。

3

1)方法重載和重寫之間的第一個也是最重要的區別是,在Java中重載方法的情況下,方法改變的簽名會在方法重寫的情況下改變。

2)方法重載與重寫在Java中的第二個主要區別在於,您可以在一個類中重載方法,但重寫只能在子類上完成。

3)不能在Java中重載靜態,最終和私有方法,但可以在Java中重載靜態,最終或私有方法。

4)Java中的重載方法通過靜態綁定綁定,重寫的方法受動態綁定的約束。

5)私有方法和final方法在Java中也不能被覆蓋。 enter image description here

瞭解更多:http://javarevisited.blogspot.com/2011/12/method-overloading-vs-method-overriding.html#ixzz3TbRYYM5z