overload和override的區別
1、方法名、參數、返回值相同。
2、子類方法不能縮小父類方法的訪問權限。
3、子類方法不能拋出比父類方法更多的異常(但子類方法可以不拋出異常)。
4、存在於父類和子類之間。
5、方法被定義爲final不能被重寫。
overload(重載)
1、參數類型、個數、順序至少有一個不相同。
2、不能重載只有返回值不同的方法名。
3、存在於父類和子類、同類中。
Java6的@override註解與Java5不同之處
首先看一下下面的示例代碼 :
Parent.java
public class Parent...{ public void parentMethod() ...{ } } |
IChild.java
public interface IChild ...{ void interfaceMethod(); } |
Child.java
public class Child extends Parent implements IChild ...{ @Override public void parentMethod() ...{ } @Override public void interfaceMethod() ...{ } } |
由於代碼很簡單,我就不做說明
上述代碼在jdk6下可以編譯通過
而在jdk5下編譯無法通過,輸出的錯誤信息如下:
Child.java:7: 方法未覆蓋其父類的方法
@Override
^
1 錯誤
上面的錯誤信息說在Child.java第七行的Override註解是不對的,不對的原因是該方法(interfaceMethod)不是父類方法。
當然,實際上這個方法是類實現的接口中方法,但是,這個語法的jdk6的下面是可以通過的,也就是說java6認爲類覆蓋父類方法與實現接口方法都叫override,而jdk5不是這樣認爲的,不知道這是當初jdk5的bug,還是當初就是認爲覆蓋父類方法與實現接口方法是不一樣的,不得而知。但是從OO角度來看,覆蓋父類方法與實現接口方法都可以認爲override,因爲他們目的都是一樣的,都是爲了重用,都是多態的一種表現方式。這從jdk6的支持這個功能就可以看出。
差一點忘了:
標準的java api文檔java5與java6對Override annotation的的解釋一樣的
java5:
Indicates that a method declaration is intended to override a method declaration in a superclass. If a method is annotated with this annotation type but does not override a superclass method, compilers are required to generate an error message.
java6:
Indicates that a method declaration is intended to override a method declaration in a superclass. If a method is annotated with this annotation type but does not override a superclass method, compilers are required to generate an error message.
兩段說明一模一樣,讓人搞不清楚的是java6文檔沒有提到Override對interface的支持。