1. 程式人生 > >java中方法重寫和過載的那些事兒

java中方法重寫和過載的那些事兒

1.重寫和過載分別是什麼意思

重寫(Override):

重寫是子類重新定義了父類的同名同參方法,覆蓋了父類的方法,因此,我們也把這種方式叫做“覆寫”。

過載(Overload):

過載是同一個類中,宣告的方法名字相同,但是引數不同的個方法,通過呼叫時傳不同的引數來達到呼叫名字相同但是方法不同的目的。

2.注意事項

是否可以在方法名字、引數個數、引數型別、引數順序都相同的時候通過方法的返回值不同來過載方法?

不能,因為java通過方法簽名來過載方法,而方法的返回值並不是方法簽名的一部分。舉個簡單的例子我們定義瞭如下兩個方法:

public int fun
(int a){} public boolean fun(int a){}

現在這兩個方法的方法名字、引數個數、引數型別、引數順序都相同,只是一個返回值是int型,另一個是boolean型。假如能通過這種方式過載的話,那麼當我們呼叫這兩個方法時根本不接收它們的返回值,那麼java該怎麼區分我們呼叫的是哪個方法呢?顯然就沒有辦法了,所以這麼一推導,通過反證法我們得出了不能通過方法的返回值不同來過載方法的結論

被子類重寫的父類方法不能是private的,否則相當於在子類中重新定義了一個新的同名方法
重寫的方法使用throws丟擲的異常必須和被重寫的方法所丟擲的異常一致,或者丟擲是被重寫方法的異常的子類異常

這個的解釋下面的連結說的很好:
https://zhidao.baidu.com/question/1987876558668853147.html
簡單的說就是子類雖然繼承了父類,拓展了父類的功能,但是做的事不能超出父類的限制,連丟擲的異常也是這樣。

重寫的方法的返回值必須和被重寫的方法的返回值一致
可以通過使方法的引數順序不同進行過載

但是這樣的話,幾個引數的型別必須不一樣,例如,我們可以把fun(float,int)這樣的方法過載成fun(int,float),但是沒法把fun(int,int)方法進行過載,因為兩個int引數無論怎麼交換順序都是兩個int型的引數。

不能通過訪問許可權,返回型別,丟擲的異常進行過載
方法的異常型別和數量不會對過載造成影響
如果在繼承情況下進行過載,被過載的方法必須不是private修飾的,否則子類只是建立了一個新方法,而不是過載
構造方法可以被過載,但是不能被重寫