首先說一下什么是重載(Overload):
(1) 方法重載是讓類以統(tǒng)一的方式處理不同類型數(shù)據(jù)的一種手段。
多個同名函數(shù)同時存在拓型,具有不同的參數(shù)個數(shù)/類型。
重載Overloading是一個類中多態(tài)性的一種表現(xiàn)。
(2) Java的方法重載蛹尝,就是在類中可以創(chuàng)建多個方法镣奋,它們具有相同的名字币呵,但具有不同的參數(shù)和不同的定義。
調(diào)用方法時通過傳遞給它們的不同參數(shù)個數(shù)和參數(shù)類型來決定具體使用哪個方法, 這就是多態(tài)性侨颈。
(3) 重載的時候余赢,方法名要一樣,但是參數(shù)類型和個數(shù)不一樣哈垢,返回值類型可以相同也可以不相同妻柒。無法以返回型別作為重載函數(shù)的區(qū)分標準。
以下是重載的例子
public class Person {
void walk(int distance) {
}
void walk(int distance, int duration) {
}
void walk(int instance, String direction){
}
}
然后再說一下什么是重寫(Override):
(1) 父類與子類之間的多態(tài)性耘分,對父類的函數(shù)進行重新定義举塔。
如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫 (Overriding)求泰。
在Java中央渣,子類可繼承父類中的方法,而不需要重新編寫相同的方法渴频。
但有時子類并不想原封不動地繼承父類的方法芽丹,而是想作一定的修改,這就需要采用方法的重寫卜朗。
方法重寫又稱方法覆蓋拔第。
(2)若子類中的方法與父類中的某一方法具有相同的方法名咕村、返回類型和參數(shù)表,則新方法將覆蓋原有的方法楼肪。
如需父類中原有的方法培廓,可使用super關(guān)鍵字,該關(guān)鍵字引用了當前類的父類春叫。
(3)子類函數(shù)的訪問修飾權(quán)限不能少于父類的肩钠。
(4)重寫方法一定不能拋出新的檢查異常或者比被重寫方法申明更加寬泛的檢查型異常暂殖。例如:
父類的一個方法申明了一個檢查異常IOException价匠,在重寫這個方法是就不能拋出Exception,只能拋出IOException的子類異常,可以拋出非檢查異常
以下是重寫的例子
public class Person {
void walk(int distance) {
}
}
class Student extends Person {
@Override
void walk(int distance) {
System.out.println("go to school");
}
}
- 重寫的特點
1呛每、覆蓋的方法的標志必須要和被覆蓋的方法的標志完全匹配踩窖,才能達到覆蓋的效果。
2晨横、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致洋腮。
3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致手形,或者是其子類啥供。
4、被覆蓋的方法不能為private库糠,否則在其子類中只是新定義了一個方法伙狐,并沒有對其進行覆蓋。
5瞬欧、方法被定義為final不能被重寫贷屎。
2.重載特點
1、在使用重載時只能通過不同的參數(shù)樣式艘虎。例如唉侄,不同的參數(shù)類型,不同的參數(shù)個數(shù)野建,不同的參數(shù)順序(當然属划,同一方法內(nèi)的幾個參數(shù)類型必須不一樣,例如可以是fun(int, float)贬墩, 但是不能為fun(int, int))榴嗅。
2妄呕、不能通過訪問權(quán)限陶舞、返回類型、拋出的異常進行重載绪励。
3肿孵、方法的異常類型和數(shù)目不會對重載造成影響唠粥。
4、對于繼承來說停做,如果某一方法在父類中是訪問權(quán)限是priavte晤愧,那么就不能在子類對其進行重載,如果定義的話蛉腌,也只是定義了一個新方法官份,而不會達到重載的效果。
最后總結(jié):
(1)多態(tài)性是面向?qū)ο缶幊痰囊环N特性烙丛,和方法無關(guān)舅巷。
簡單說,就是同樣的一個方法能夠根據(jù)輸入數(shù)據(jù)的不同河咽,做出不同的處理钠右,即方法的
重載——有不同的參數(shù)列表(靜態(tài)多態(tài)性)
(2) 而當子類繼承自父類的相同方法,輸入數(shù)據(jù)一樣忘蟹,但要做出有別于父類的響應(yīng)時飒房,你就要覆蓋父類方法,
即在子類中重寫該方法——相同參數(shù)媚值,不同實現(xiàn)(動態(tài)多態(tài)性)
歡迎關(guān)注公眾號狠毯,Charming寫字的地方