Override : 重寫。 當子類的某個方法的方法名、返回值、參數列表均與父類的方法保持一致,我們就可以說子類重寫了父類的該方法。
其中需要注意:
- 父類中修飾符為private, static, finnal的方法是無法被子類Override的
- 子類方法的返回值可以是父類方法返回值的子類或一致。例如父類方法返回值為Object類型,子類方法返回值是String,這是OK的
- 子類方法的訪問權限修飾符要對父類進行擴展或者一致。例如父類方法由protected修飾,子類方法是public,這是OK的
下面我們就來舉個栗子 :
父類: BaseClass
package test.annotations; public class BaseClass { public void dosomething(String str){ System.out.println("Base dosomething: " + str); } }
子類: ChildClass
package test.annotations; public class ChildClass extends BaseClass{ //@Override public void dosomething(String str){ System.out.println("Child dosomething :" + str); } }
測試類: OverrideTest
package test.annotations; public class OverrideTest { public static void main(String[] args) { // TODO Auto-generated method stub BaseClass base = new ChildClass(); base.dosomething("override"); } }
如圖,測試結果為 :
Child dosomething : override
簡單典型的重寫栗子。我們做一下修改,把BaseClass類的dosomething方法參數改為Object類型,然后再次運行測試類,結果為:
Base dosomething : override
原因:修改BaseClass方法參數后,dosomething在父類與子類中構不成重寫。因此當調用dosomething方法時,檢查到父類中有這個方法並且該方法未被子類override,因此調用父類的dosomething方法。
如果我們繼續將ChildClass類的dosomething方法之上的注釋"//"去掉,就會發現編譯器提示出錯 :
The method dosomething(String) of type must override or implement a supertype method
原因:此時@Override注釋說明dosomething為重寫方法,而此方法實際上構不成重寫,因此編譯器提示錯誤。刪除@Override注釋或者在父類中再添加一個dosomething方法以達到構成重寫的效果即可。
由上面可見,當我們對父類進行修改時,很有可能會在無法察覺的時候對一些曾經使用重寫特性的地方產生影響。這個時候,我們就需要@Override注釋了。當你想要在子類中override父類的方法時,請務必加上@Override注釋,這樣當父類方法有改動時,編譯器也會在子類方法處做出相應錯誤提示,避免人工失誤。這是不是也說明一個道理: 錯誤扼殺在編譯階段,要比在運行時階段處理好得多。
總結:當你想要在子類中override父類的方法時,請務必加上@Override注釋。
分享一篇文章:http://www.journaldev.com/817/overriding-methods-in-java-always-use-override-annotation