1. 程式人生 > >Java之路:方法過載與重寫的區別

Java之路:方法過載與重寫的區別

一、方法的過載(overload)

方法名相同但引數列表不同的方法簽名機制,稱之為方法的過載(method overload)。

過載的表現形式就是呼叫一系列具有相同名稱的方法,這些方法可根據傳入引數的不同而得到不同的處理結果,這其實就是多型性的一種體現,這屬於靜態多型,即同一種介面,不同的實現方式。 這種多型是在程式碼編譯階段就確定下來的。


(1)方法名稱相同。
(2)方法的引數列表不同(引數個數、引數型別、引數順序,至少有一項不同)。
(3)方法的返回值型別和修飾符不做要求,可以相同,也可以不同。無法以返回型別作為過載函式的區分標準。
(4)方法的簽名僅包括方法名稱和參,因此方法過載不能根據方法的不同返回值來區分不同方法,因為返回值不屬於方法簽名的一部分。
(5)在過載的關係之中,返回值型別可以不同,語法上沒有錯誤,但是從實際的應用而言,建議,返回值型別相同。
(6)過載只發生在一個類中。

例如,int add(int, int)和void add(int, int)的方法簽名是相同的,編譯器會“認為”這兩個方法完全相同而無法區分,故此它們無法達到過載的目的。

二、方法的重寫(override)

重寫是子類對父類的允許訪問的方法的實現過程進行重新編寫, 返回值和形參都不能改變。即外殼不變,核心重寫

重寫也是一種多型形式,在程式執行階段才能體現出來,這種方式稱為動態聯編,也稱為晚期聯編(late bingding)。

(1)重寫發生在父類與子類之間。
(2)返回型別、引數列表必須完全與被重寫方法的相同。
(3)重寫訪問許可權不能比父類中被重寫的方法的訪問許可權更低。 例如:如果父類的一個方法被宣告為public,那麼在子類中重寫該方法就不能宣告為protected。
(4)構造方法不能被重寫。
(5)宣告為final的方法不能被重寫。
(6)宣告為static的方法不可以被重寫。如果父類中有一個靜態的方法,子類也有一個與其方法名,引數型別,引數個數都一樣的方法,並且也有static關鍵字修飾,那麼該子類的方法會把原來繼承過來的父類的方法隱藏

,而不是重寫
(7)子類和父類在同一個包中,那麼子類可以重寫父類所有方法,除了宣告為private和final的方法。
(8)子類和父類不在同一個包中,那麼子類只能夠重寫父類的宣告為public和protected的非final方法。

三、過載與重寫的比較

在這裡插入圖片描述

面試題:過載(Overload)和重寫(Override)的區別?

答:方法的過載和重寫都是實現多型的方式,區別在於過載實現的是編譯時的多型性,而重寫實現的是執行時的多型性。過載發生在一個類中,同名的方法如果有不同的引數列表(引數型別不同、引數個數不同或者二者都不同)則視為過載;重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的引數列表,有相容的返回型別,比父類被重寫方法更好訪問,不能比父類被重寫方法宣告更多的異常(里氏代換原則)。過載對返回型別沒有特殊的要求,不能根據返回型別進行區分。