方法名相同但引數列表不同的方法簽名機制,稱之為方法的過載(method overload)。
過載的表現形式就是呼叫一系列具有相同名稱的方法,這些方法可根據傳入引數的不同而得到不同的處理結果,這其實就是多型性的一種體現,這屬於靜態多型,即同一種介面,不同的實現方式。這種多型是在**編譯階段就確定下來的。
(1)方法名稱相同。(2)方法的引數列表不同(引數個數、引數型別、引數順序,至少有一項不同)。例如,int add(int, int)和void add(int, int)的方法簽名是相同的,編譯器會「認為」這兩個方法完全相同而無法區分,故此它們無法達到過載的目的。(3)方法的返回值型別和修飾符不做要求,可以相同,也可以不同。無法以返回型別作為過載函式的區分標準。
(4)方法的簽名僅包括方法名稱和形參,因此方法過載不能根據方法的不同返回值來區分不同方法,因為返回值不屬於方法簽名的一部分。
(5)在過載的關係之中,返回值型別可以不同,語法上沒有錯誤,但是從實際的應用而言,建議,返回值型別相同。
(6)過載只發生在乙個類中。
重寫是子類對父類的允許訪問的方法的實現過程進行重新編寫, 返回值和形參都不能改變。即外殼不變,核心重寫!
重寫也是一種多型形式,在程式執行階段才能體現出來,這種方式稱為動態聯編,也稱為晚期聯編(late bingding)。
(1)重寫發生在父類與子類之間。(2)返回型別、引數列表必須完全與被重寫方法的相同。(3)重寫訪問許可權不能比父類中被重寫的方法的訪問許可權更低。例如:如果父類的乙個方法被宣告為public,那麼在子類中重寫該方法就不能宣告為protected。(4)構造方法不能被重寫。
(5)宣告為final的方法不能被重寫。
(6)宣告為static的方法不可以被重寫。如果父類中有乙個靜態的方法,子類也有乙個與其方法名,引數型別,引數個數都一樣的方法,並且也有static關鍵字修飾,那麼該子類的方法會把原來繼承過來的父類的方法隱藏,而不是重寫。
(7)子類和父類在同乙個包中,那麼子類可以重寫父類所有方法,除了宣告為private和final的方法。
(8)子類和父類不在同乙個包中,那麼子類只能夠重寫父類的宣告為public和protected的非final方法。
面試題:過載(overload)和重寫(override)的區別?答:方法的過載和重寫都是實現多型的方式,區別在於過載實現的是編譯時的多型性,而重寫實現的是執行時的多型性。過載發生在乙個類中,同名的方法如果有不同的引數列表(引數型別不同、引數個數不同或者二者都不同)則視為過載;重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的引數列表,有相容的返回型別,比父類被重寫方法更好訪問,不能比父類被重寫方法宣告更多的異常(黎克特制代換原則)。過載對返回型別沒有特殊的要求,不能根據返回型別進行區分。
Java方法重寫與方法過載
方法過載 發生在同乙個類中,方法名相同並且方法形參列表不同就會過載方法。與方法返回型別無關。方法重寫 發生在繼承當中,如果子的乙個類方法與父類中的那個方法一模一樣 1 方法名相同 2 形參列表相同 3 子類要重寫父類的那個方法返回型別與父類被重寫的方法的返回型別相同或者為父類方法返回型別的子型別 4...
Java中方法重寫與方法過載
重寫規則 1.引數列表必須完全與被重寫方法的相同。2.返回型別必須完全與被重寫方法的返回型別相同。3.訪問許可權不能比父類中被重寫的方法的訪問許可權更高。例如 如果父類的乙個方法被宣告為public,那麼在子類中重寫該方法就不能宣告為protected。4.父類的成員方法只能被它的子類重寫。5.宣告...
Java中方法重寫與方法過載
即方法覆蓋。指的是父子類中方法的關係。父類a中有方法method1,在子類中想要使用method1這個方法簽名而又要實現與父類method1方法不同的功能,這個時候就要用到方法重寫。即子類使用父類的方法簽名,但子類方法體與父類不同,實現的功能不同。public class a public clas...