Java 編程下 Overload 和 Override 的區別


如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載 (Overloading)。本文介紹的是 Overload 和 Override 的區別。

Overload 是重載的意思,Override 是覆蓋的意思,也就是重寫。

  • 重載 (Overload)  表示同一個類中可以有多個名稱相同的方法,但這些方法的參數列表各不相同(即參數個數、類型或順序不同)。
  • 重寫 (Override)  表示子類中的方法可以與父類中的某個方法的名稱 和參數完全相同,通過子類創建的實例對象調用這個方法時,將調用子類中的定義方法,這相當於把父類中定義的那 個完全相同的方法給覆蓋了,這也是面向對象編程的多態性的一種表現。(備注:子類覆蓋父類的方法時,只能比父類拋出更少的異常,或者是拋出父類拋出的異常 的子異常,因為子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的訪問權限只能比父類的更大,不能更小。如果父類的方法 是 private 類型,那么,子類則不存在覆蓋的限制,相當於子類中增加了一個全新的方法。)

至於 Overloaded 的方法是否可以改變返回值的類型這個問題,要看你倒底想問什么呢?這個題目很模糊。如果幾個 Overloaded 的方法的參數列表不一樣,它們的返回者類型當然也可以不一樣。

但我估計你想問的問題是:如果兩個方法的參數列表完全一樣,是否可以讓它們的返回值不同來實現重 載 Overload。這是不行的,我們可以用反證法來說明 這個問題,因為我們有時候調用一個方法時也可以不定義返回結果變量,即不要關心其返回結果,例如,我們調用map.remove(key) 方法時,雖 然 remove 方法有返回值,但是我們通常都不會定義接收返回結果的變量,這時候假設該類中有兩個名稱和參數列表完全相同的方法,僅僅是返回類型不 同,java就無法確定編程者倒底是想調用哪個方法了,因為它無法通過返回結果類型來判斷。

Override  可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了一個方法並 且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對接口方法的實現,在接口中一般只是 對方法進行了聲明,而我們在實現時,就需要實現接口聲明的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。在覆蓋要注意 以下的幾點:

  1. 覆蓋的方法的標志必須要和被覆蓋的方法的標志完全匹配,才能達到覆蓋的效果;
  2. 覆蓋的方法的返回值必須和被覆蓋的方法的返回值一致;
  3. 覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;
  4. 被覆蓋的方法不能為 private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。

Overload  可以翻譯為重載,它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入參數來區分這些方法,然后再調用時,VM就會根據不同的參數樣式,來選擇合適的方法執行。在使用重載要注意以下的幾點:

  1. 在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如可以是 fun(int,float),但是不能為 fun(int,int));
  2. 不能通過訪問權限、返回類型、拋出的異常進行重載;
  3. 方法的異常類型和數目不會對重載造成影響;
  4. 對於繼承來說,如果某一方法在父類中是訪問權限是 private,那么就不能在子類對其進行重載,如果定義的話,也只是定義了一個新方法,而不會達到重載的效果。

總之,重寫 Overriding 是父類與子類之間多態性的一種表現,重載 Overloading 是一個類中多態性的一種表現。很重要的一點就是,Overloaded 的方法是可以改變返回值的類型。

另 外:在Java語言規范中,一個方法的特征僅包括方法的名字,參數的數目和種類,而不包括方法的返回類型,參數的名字以及所拋出來的異常。在Java編譯 器檢查方法的重載時,會根據這些條件判斷兩個方法是否是重載方法。但在Java編譯器檢查方法的置換時,則會進一步檢查兩個方法(分處超類型和子類型)的 返還類型和拋出的異常是否相同。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM