本文聊聊Overload和Override的區別。Overload的方法是否可以改變返回值的類型。
Overload是重載的意思,Override是覆蓋的意思,也就是重寫。
重寫Override表示子類中的方法可以與父類中的某個方法的名稱和參數完全相同,通過子類創建的實例對象調用這個方法時,將調用子類中定義的方法,這相當於把父類中的方法給覆蓋了,這也是多態性的一種表現。
重載overload的特點就是與返回值無關,只看參數列表,所以重載的方法可以改變返回值類型。所以,如果兩個方法的參數列表完全一樣,是不能通過讓它們的返回值類型不同來實現重載的。我們可以用反證法來說明這個問題,因為我們有時候調用一個方法時也可以不定義返回結果變量,即不要關心其返回結果,例如,我們調用map.remove(key)方法時,雖然remove方法有返回值,但是我們通常都不會定義接收返回結果的變量,這時候假設該類中有兩個名稱和參數列表完全相同的方法,僅僅是返回類型不同,java就無法確定編程者倒底是想調用哪個方法了,因為它無法通過返回結果類型來判斷。
override是覆蓋一個方法並且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對接口方法的實現,在接口中一般只是對方法進行了聲明,而我們在實現時,就需要實現接口聲明的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。關於覆蓋的方法的標志必須和被覆蓋的方法,在重寫時要注意以下的幾點:
- 二者的標志完全匹配才能達到覆蓋的效果;
- 返回值必須一致;
- 所拋出的異常必須一致或者是其子類;
- 被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。
overload對我們來說可能比較熟悉,可以翻譯為重載,它是指我們可以定義一些名稱相同的方法,通過定義不同類型的輸入參數來區分這些方法,然后再調用時,JVM就會根據不同的參數樣式,來選擇合適的方法執行。在使用重載時要注意以下的幾點:
- 只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如可以是fun(int,float),但是不能為fun(int,int));
- 不能通過訪問權限、返回類型、拋出的異常進行重載;
- 方法的異常類型和數目不會對重載造成影響;
- 對於繼承來說,如果某一方法在父類中的訪問權限是priavte,那么就不能在子類對其進行重載,如果定義的話,也只是定義了一個新方法,而不會達到重載的效果。
方法的重寫和重載是Java多態性的不同表現。重寫是父類與子類之間多態性的一種表現,而重載是一個類中多態性的一種表現。
