1. 程式人生 > 程式設計 >Java方法過載和重寫原理區別解析

Java方法過載和重寫原理區別解析

一、方法重寫(0verride)

在Java 程式中,類的繼承關係可以產生一個子類,子類繼承父類,它具備了父類所有的特徵,繼承了父類所有的方法和變數。

子類可以定義新的特徵,當子類需要修改父類的一些方法進行擴充套件,增大功能,程式設計者常常把這樣一種操作方法稱為重寫,也可以叫覆寫或覆蓋。

所以,所謂方法的重寫是指子類中的方法和父類中繼承的方法有完全相同的返回值型別、方法名、引數個數和引數型別。這樣就可以實現對父類方法的覆蓋。

如果子類將父類的方法重寫了,呼叫的時候肯定是呼叫被重寫過的子類的方法,但是如果要還要繼續呼叫父類的方法我們該怎麼做呢?

此時通過 super 關鍵字可以實現這個功能。super 關鍵字可以從子類訪問父類中的內容,如果要訪問被重寫過的方法,使用“super.(引數列表)” 的形式呼叫即可。

當然,如果要使用 super 關鍵字不一定非要在方法重寫後使用,也可以明確的表示某個方法是從父類中繼承而來的。使用 super 只是更加明確的說,要從父類中查詢,就不在子類中查找了。

重寫有以下規則

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

(2).父類返回的型別必須與被子類重寫的方法的引數列表相同,否則不能稱其為重寫而是過載。

(3).Java 中規定,被子類重寫的方法不能擁有比父類方法更加樣額的訪問許可權。

編寫過Java程式的人應該都知道,父類的中方法並不是在任何情況下都可以重寫的,當父類中的方法訪問許可權修飾符為 private時,該方法只能被自己的類訪問,不能被外部訪問,在子類是不能被重寫的。如果定義父類的方法為 public,在子類定義為private 程式執行就會出錯。

(4).由於父類的訪問許可權修飾符限制一定要大於被子類重寫的方法的訪問許可權修飾符,而 private 許可權最小,所以如果某一個方法在父類的訪問許可權是 private 時,那麼就不能再子類中對其進行重寫。如果重寫定義,也只是定義了一個新的方法,不會達到重寫的效果。

(5).在繼承過程中如果父類當中的方法丟擲異常,那麼在子類中重寫父類的該方法時,也要丟擲異常。而且丟擲的異常不能多於父類中丟擲的異常(可以等於父類中丟擲的異常)。換句話說,重寫方法一定不能丟擲新的檢查異常,或者比被重寫方法宣告更加寬泛的檢查異常。

例如:父類的一個方法申明瞭一個檢查異常 IOException ,在重寫這個方法時就不能丟擲 Exception,只能丟擲 IOException的子類異常,可以丟擲非檢查異常。同樣的道理,如果子類建立了一個成員變數,而該變數和父類中一個變數名稱相同,稱作變數重寫或者屬性覆蓋(這個概念一般很少人研究,意義不大)。

二、方法過載(ordeloading)

概念:所謂的方法過載是指在一個類中,多個方法的方法名相同,但是引數列表不同。引數列表不同指的是引數個數、引數型別或者引數的順序不同。

方法過載是讓類以統一的方式處理不同型別資料的一種手段。呼叫方法時通過傳遞給它們的不同個數和引數來決定具體使用哪個方法,這就是Java中的多型。

在方法過載時,方法之間需要存在一定的聯絡,因為這樣可以提高程式的可讀性,一般只過載功能相似的方法。

我們可以定義一些名稱相同的方法,再通過定義不同的引數來區分方法,然後在呼叫時,Java 虛擬機器就會根據不同的引數列表來選擇合適的方法執行。也就是說,當一個過載的方法被呼叫時,Java 用引數型別或者個數來決定世界呼叫的過載方法。因此,每個過載方法的引數的型別或者個數必須不同。

雖然每個過載的方法可以有不同的返回型別,但返回型別並不足以區分所使用的是哪個方法。

當Java 呼叫一個過載方法時,引數與呼叫引數匹配的方法被執行。在使用過載要注意以下幾點:

(1).在使用過載時只能通過不同的引數列表,必須具有不同的引數列表

(2).不能通過訪問許可權、返回型別、丟擲的異常進行過載

(3).方法的異常型別和數目不會對過載造成影響。

(4).可以有不同的返回值型別,只要引數列表不同就可以

(5).可以有不同的訪問修飾符

(6).可以丟擲不同的異常

三、方法重寫和過載的區別

Java方法過載和重寫原理區別解析

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。