Java 重寫和過載區別——物件導向的多型性分析

艾陽丶發表於2017-05-04

前言

我們知道物件導向主要是封裝、繼承和多型,重寫和過載都有物件導向的多型性,而一字相同,區別大不同。重寫是子類繼承父類中方法,屬於動態多型性。過載發生在同一個類中方法名相同引數個數或型別不同,且與返回值無關,屬於靜態多型性。呼叫被過載過的方法可以大大減少程式碼的輸入量,根據傳遞不同的引數就可以決定不同的功能或返回值。重寫和過載會讓我們在實際開發中程式碼結構更加清晰簡潔。


一、特性區別


過載(Overloading)

    (1) 過載是讓類以統一的方式處理不同型別資料的一種手段。多個同名函式同時存在,具有不同的引數個數/型別。

    (2) 呼叫方法時通過傳遞給它們的不同引數個數和引數型別來決定具體使用哪個方法,這是多型性表現形勢。

    (3) 過載的時候,返回值型別可以相同也可以不相同。無法以返回型別作為過載函式的區分標準。

   總結:簡單說,就是同樣的一個方法能夠根據輸入資料的不同,做出不同的處理,即方法的過載——有不同的引數列表(靜態多型性)。


重寫(Overriding)

    (1)父類與子類之間的多型性,對父類的函式進行重新定義。若子類並不想原封不動地繼承父類的方法,就需要重寫,又稱方法覆蓋。

    (2)若子類中存在與父類中的方法具有相同的方法名、返回型別和引數時,方法將覆蓋原方法即重寫。如果需要父類原方法,可使用super關鍵字。

    (3)子類函式的訪問修飾許可權不能少或小於父類的許可權。 

   總結: 當子類繼承自父類的相同方法,輸入資料一樣,但要做出有別於父類的響應時,你就要覆蓋父類方法, 即在子類中重寫該方法,是一種相同引數,不同實現的特性。(動態多型性)



二、使用規則區別 


過載(Overloading)

1、必須具有不同的引數列表;

2、可以有不責罵的返回型別,只要引數列表不同就可以了;

3、可以有不同的訪問修飾符;

4、可以丟擲不同的異常;


重寫(Overriding)

1、引數列表必須完全與被重寫的方法相同,否則不能稱其為重寫而是過載。

2、返回的型別必須一直與被重寫的方法的返回型別相同,否則不能稱其為重寫而是過載。

3、訪問修飾符的限制一定要大於被重寫方法的訪問修飾符(public>protected>default>private)

4、重寫方法一定不能丟擲新的檢查異常或者比被重寫方法申明更加寬泛的檢查型異常。例如:

父類的一個方法申明瞭一個檢查異常IOException,在重寫這個方法是就不能丟擲Exception,只能丟擲IOException的子類異常,可以丟擲非檢查異常。

 




相關文章