Overload(過載)和Override(重寫)的區別
Overload是過載的意思,Override是覆蓋的意思,也就是重寫。
Overload
過載Overload表示同一個類中可以有多個名稱相同的方法 ,但這些方法的引數列表各不相同 ,即引數個數或型別不同。
Override
重寫Override表示子類中的方法可以與父類中的某個方法的名稱和引數完全相同 ,通過子類建立的例項物件呼叫這個方法時,將呼叫子類中的定義方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是面向物件程式設計的多型性 的一種表現。子類覆蓋父類的方法時,只能比父類丟擲更少的異常 ,或者是丟擲父類丟擲的異常的子異常 ,因為子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的訪問許可權只能比父類的更大 ,不能更小。如果父類的方法是private型別,那麼,子類則不存在覆蓋的限制,相當於子類中增加了一個全新的方法。
Overloaded的方法是否可以改變返回值的型別?
1.如果幾個Overloaded的方法的引數列表不一樣,它們的返回者型別當然也可以不一樣。
2.如果兩個方法的引數列表完全一樣,是否可以讓它們的返回值不同來實現過載Overload?答案是不行的。例如,我們呼叫map.remove(key)方法時,雖然remove方法有返回值,但是我們通常都不會定義接收返回結果的變數,這時候假設該類中有兩個名稱和引數列表完全相同的方法,僅僅是返回型別不同,java就無法確定程式設計者倒底是想呼叫哪個方法了,因為它無法通過返回結果型別來判斷 。
Override注意事項
Override是覆蓋了一個方法並且對其重寫,以求達到不同的作用 。對我們來說最熟悉的覆蓋就是對介面方法的實現。 另外,我們在繼承中也可能會在子類覆蓋父類 中的方法。在覆蓋時要注意以下幾點:
1.覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配 ,才能達到覆蓋的效果;
2.覆蓋的方法的返回值必須和被覆蓋的方法的返回值一致 ;
3.覆蓋的方法所丟擲的異常必須和被覆蓋方法的所丟擲的異常一致 ,或者是其子類 ;
4.被覆蓋的方法不能為private ,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。
Overload注意事項
Overload是指我們可以定義一些名稱相同的方法,通過定義不同的輸入引數來區分這些方法,然後再呼叫時,VM就會根據不同的引數樣式,來選擇合適的方法執行 。在過載時要注意以下幾點:
1.在使用過載時只能通過不同的引數樣式 。例如,不同的引數型別,不同的引數個數,不同的引數順序(當然,同一方法內的幾個引數型別必須不一樣,例如可以是fun(int,float),但是不能為fun(int,int));
2.不能通過訪問許可權 、返回型別 、丟擲的異常 進行過載;
3.方法的異常型別 和數目 不會對過載造成影響;
4.對於繼承來說,如果某一方法在父類中是訪問許可權是priavte ,那麼就不能在子類對其進行過載 ,如果定義的話,也只是定義了一個新方法,而不會達到過載的效果。