2010-06-01 39 views
63

(新手到Java,舊時代的C#的傢伙。)的Android @覆蓋使用

我已經注意到了很多Android的代碼示例使用@Override的。我認爲所有的Java方法都默認爲「虛擬」?

那麼@Override呢?

例子:

private class HelloWebViewClient extends WebViewClient { 

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     view.loadUrl(url); 
     return true; 
    } 
} 
+6

作爲一個說明,「Override」不是Android特有的,而是存在於Java 5和更新版本中的註釋:http://java.sun.com/j2se/1.5.0/docs/api/java/ lang/Override.html – Powerlord 2010-06-01 15:09:39

+2

這整個問題/線程幫助我理解了@ @ override是如何工作的。好問題,很好的答案。謝謝你們。 – 2011-12-23 16:59:17

回答

91

這是一個註釋,你可以用它來告訴你打算是有註釋是一個超類方法的重寫方法的編譯器和你的IDE。它們在出現錯誤時會有警告/錯誤,例如,如果您打算重寫某個方法但拼寫錯誤,如果註釋位於IDE中,或者編譯器會告訴您實際上重寫了超類方法因此您可以確定原因並糾正拼寫錯誤。

這對於Android應用程序和活動來說更爲重要,例如,所有調用都將基於活動生命週期 - 並且如果您沒有正確覆蓋生命週期方法,則它們永遠不會被框架調用。一切都會很好地編譯,但你的應用程序不會按照你的意圖工作。如果添加註釋,則會出現錯誤。

+7

這不僅僅是爲了IDE。如果@Override不在超類中的方法,Java編譯器將產生錯誤。 – 2010-06-01 18:13:26

+1

@羅曼蓋伊:推銷員! – JRL 2010-06-01 18:37:58

21

Override-Annotation只是編譯器的一個提示,想要覆蓋某個函數。如果函數存在那麼編譯器會檢查父類和接口。如果沒有,你會得到一個編譯錯誤。

它基本上只是一個安全機制。

僅供參考,請參閱this article(覆蓋在中間的某個地方解釋)

+5

該鏈接已經死亡 – Flexicoder 2013-07-12 10:00:31

+2

[Archived version](https://web.archive.org/web/20080905021258/http://java.sun.com/docs/books/tutorial/java/javaOO/annotations.html) – HEATH3N 2015-02-09 01:03:51

+0

感謝您的更新鏈接。我更新了我的答案。 – lostiniceland 2015-02-09 09:43:04

50

此代碼爲誰真的想了解有關@Override過程中的初學者,這將幫助你! (提示Java的繼承概念。)

例如,Fish類可能有兩個子類:FreshwaterFishSaltwaterFish

這些子類將具有Fish類的所有功能,但可以通過新屬性和行爲或父類Fish的修改後的行爲進一步自定義對象。例如,FreshwaterFish課程可能包含有關居住在淡水環境中的類型(例如河流,湖泊,池塘或水坑)的信息。

類似地,SaltwaterFish類可能定製makeBabyFish()方法,使得魚養殖後吃它的對偶(如在超類中定義的),通過使用超控機構,象這樣:

public class SaltwaterFish extends Fish 
{ 
    @Override 
    public void makeBabyFish(Fish fishSpouse, int numBabies) { 
     // call parent method 
     super.makeBabyFish(fishSpouse, numBabies); 
     // eat mate 
     eat(fishSpouse); 
    } 
} 
+2

非常好的解釋..謝謝 – 2013-11-01 11:08:39

+0

因此,基本上你使用覆蓋「取消」,並重寫超級類的功能。得到它了。 – 2014-06-21 12:07:54

+1

爲什麼在調用它之前沒有在添加方法之前添加類名? – erical 2016-06-02 14:54:23

0

覆蓋大部分是在定義方法的情況下使用。取代與其含義類似。

我會嘗試以非常蹩腳的方式解釋。假設您已經定義了Oncreate()方法並且具有與其關聯的屬性,請假設。再次,當您在代碼中爲某個對象調用Oncreate()方法時,現在編寫的代碼將會爲應用程序重寫Oncreate()的正式定義的屬性或繼承屬性。