2011-08-23 89 views
9

誰能告訴我,如果這個代碼:@Override註釋

public class OvTester { 
    @Override 
    public int hashCode() { 
     return toString().hashCode(); 
    } 
} 

確定在OvTester類的toString方法覆蓋其超類中的方法toString

我想知道這是否屬實,如果有的話,它是如何工作的?

如果這不是真的,那麼這是真的:

「的hashCode()方法OvTester必須覆蓋其超類中的同名方法」

如果這不正確那麼什麼是正確的?

+1

你的類似乎沒有超類,所以這將失敗。 – Sirs

+9

當然它有一個超類 - 'java.lang.Object' – Bozho

回答

13

方法壓倒一切的發生。

所以在這裏你將覆蓋hashCode(),不toString()

@Override註釋是可選的(但一個非常好的事情),並表示這是有望被改寫。如果拼寫錯誤或者輸入了錯誤的參數,編譯器會發出警告。

所以,是的,第二個說法是正確的(在這種情況下超是java.lang.Object

2

我想知道這是否屬實,如果是的話,它是如何工作的?

不,這不完全正確。

@Overrides註解說:「此方法會覆蓋在父類同名方法」。

在這種情況下,hashCodeOvTester優先於hashCodeObject

如果它不是真實的,那麼這是真的:在hashCode()方法OvTester必須覆蓋其超類中的同名方法?

是的。這正是它的工作原理。


當一個方法沒有做別的事情,而不是調用另一個方法(幾乎是你在你的例子了)它通常被稱爲delegate method。也許這就是你混淆這一點。

0

不,這隻會意味着hashCode()方法被覆蓋。編譯器將在編譯時檢查hashCode()是否真的是一個被覆蓋的方法(帶有該簽名)。

0

@Override只是編譯時檢查實施者是否真的重寫了方法。

,如果你嘗試重寫

@Override 
public void equals(Object ob){ 

} 

它將無法編譯,當你重新定義在sublcass相同簽名的方法

1

@Override批註不「確定」任何東西。它只是一個標誌,告訴編譯器如果註釋的方法不覆蓋超類或接口方法,則會引發錯誤。它是開發人員幫助維持理智的工具,除此之外,

在這種特定情況下,僅僅注意到中的hashCode()實現覆蓋了Object中定義的hashCode()方法。這與toString()完全沒有關係,並且從您的hashCode()方法中調用超類的toString()方法與重寫toString()不會有相同之處。

這是真的嗎? OvTester中的hashCode()方法必須在其superClass中覆蓋相同的 名稱方法?

這確實是真的,在這個意義上,註釋會導致如果沒有在註釋方法的簽名相匹配的超可重寫hashCode()方法編譯器產生一個錯誤。

0

該代碼覆蓋hashCode()方法構成基類Object類。 toString()方法仍有原始實現。

要覆蓋toString(),您執行以下操作:

@Override 
public String toString() { 
    //Your own toString() implememntation here 
} 

只要在子類中的方法具有相同的名稱和簽名作爲父類的方法,而在方法父類是不是私人它將被過度使用(不管是否存在註釋@Override