2016-01-22 65 views
-3

今天,我正在寫一個Java類與toString()方法,我注意到了^箭頭Eclipse中提出,當你重寫超類中的方法。我做了一些澄清研究找出我是壓倒一切java.lang.object.toString後發現,每類都有java.lang.object與其超(REF here)。爲什麼toString()是java.lang.object的隱式覆蓋?

通常情況下,當我看到壓倒一切的,它有註釋@Override

我的問題是,爲什麼我toString()方法隱式(不@Override)覆蓋超java.lang.objecttoString()方法?

+0

抱歉,這個問題有點不清楚。當你說「含蓄」時,你的意思是什麼?如果您想通過添加和「@ Override」註釋來使其更加明確,您可以自由地這樣做。 –

+0

隱含。不使用'@ override' – intboolstring

+3

但它是你自己的班級。您可以添加,如果你想...註釋完全是可選的,只有在那裏你的意圖明確的編譯器,也就是說,如果您添加註釋,但你實際上並沒有覆蓋的方法,你會得到一個編譯器警告/錯誤。 –

回答

3

你不必使用@Override重寫一個方法,它總是覆蓋它(也許在歷史上的某個時刻需要註釋,我不知道)。如果你使用超類方法的相同簽名編寫一個方法,它將被覆蓋。

如果你不想要一個方法將其被override設置爲私有或最終(如果它是一個公共方法)

+4

其實歷史原因是相反的:這個註解是在JDK5中引入的(在JDK6中有所改進)。因此,不要求破壞與舊代碼的兼容性。它現在所做的只是一個選擇性的額外檢查,該方法實際上覆蓋了一些東西。防止拼寫錯誤或者像'equals(MyClass x)'這樣的錯誤(它不會覆蓋Object中的equals,儘管很多人都假設它是這樣做的)。 – Thilo

1

@override是一個註釋做。它實際上不會轉換成編譯時的任何字節碼。它更像是暗示編譯器和開發人員明白其覆蓋它的清晰視覺提示

+0

確實如此,但是(1)不正確地使用註解仍然可以中止編譯過程,(2)可能想到的缺失的註釋也會中止編譯過程(目前沒有按照我的知識完成)和(3)一些註釋保留在類文件中(這非常接近「字節碼」) – Thilo

1

正如其他人已經指出的那樣,覆蓋方法不需要註釋@OverrideJava API documentation非常清楚地描述了目的。 @Override告訴編譯器,你想要一個方法來覆蓋超類的類。因此,編譯器可以警告您,如果您在方法名稱中有拼寫錯誤,或者方法的簽名與超類中任何方法的簽名不匹配。