2013-07-26 18 views
4

這是一個新手問題。 我讀過JVM的執行從搜索層次結構中最低類的methodname開始,如果該方法在該類中不可用,它將遍歷父類來尋找方法。JVM - 子類方法的執行順序和@override的使用

如果是這種情況,那麼爲什麼我們需要使用「@override」將自定義邏輯添加到繼承類?

下面的例子說明了我的問題

class superclassA 
{ 

method() 
{ 
} 

} 

class subclassB extends superclassA 
{ 

@Override 
//While executing if JVM starts looking for the method name from the lowest hierarchy 
//then why do we have to use "override" as the methodname will be matched from the lowest level itself? 
method() 
{ 
--custom subclass specific code... 
} 

} 
+3

你不需要'@ Override'。它僅在最近才引入(Java 1.5),並且完全是可選的。 - 它的目的是避免程序中的錯誤,因爲它告訴編譯器你實際上*打算*覆蓋特定的方法。例如,如果您錯誤地輸入了方法的名稱,那麼繼承的方法會被* not *覆蓋,並且可能會導致一些令人討厭的錯誤。使用'@ Override'時,編譯器至少會警告你,如果註釋的方法不*實際覆蓋繼承的方法。 – JimmyB

+0

謝謝hanno..it解釋 – UnderDog

+0

@HannoBinder 1。5是相當新近的?在1.5版發佈之前,它已經超過1.0了。 –

回答

5

如果是這種情況,那麼爲什麼我們需要使用「@override」將自定義邏輯添加到繼承類?

我們沒有。該@Override註解沒有技術含義 - 它的存在是爲了文件的事實,此方法將覆蓋一個超類,它具有一定的優勢:

  • 如果你看一下代碼,它會告訴你有一個超方法,這對於理解此方法的作用可能很重要
  • 如果超類方法的簽名以子類方法實際上不再覆蓋它的方式進行更改,則會出現編譯器錯誤。
  • 如果您在不使用註釋的情況下重寫某個方法,則可能會收到編譯器警告,以免無意中執行該操作。
1

你不需要@Override。但是這是一個有用的註釋,它會使編譯器檢查你是否確實覆蓋了你所說的方法。當您實際上不覆蓋某個方法時,編譯器會通知您這種差異。此外,它只是讓您的代碼更加清晰:因爲Java中的所有方法都是隱式虛擬的,並且派生類中的方法與super類中的非final方法的簽名具有相同的簽名,因此隱式地覆蓋該方法, @Override使得代碼更容易理解人類

:很明顯,你可以不在具有相同簽名作爲一個超類中的方法final派生類中的方法。

2

@Override只是幫助Java編譯器檢測源代碼中的錯誤,如果使用@Override註釋的方法實際上不覆蓋它,編譯器會生成一個錯誤。

這不是強制性的,用@Override註解覆蓋超類型方法的方法。