重寫和重載區(qū)別
重寫方法的規(guī)則如下:
- 參數(shù)列表:必須與被重寫方法的參數(shù)列表完全匹配。
- 返回類型:必須與超類中被重寫的方法中聲明的返回類型或子類型完全相同
- 訪問級別:一定不能比被重寫方法強喂走,可以比被重寫方法的弱小染。
- 非檢查異常:重寫方法可以拋出任何非檢查的異常,無論被重寫方法是否聲明了該異常溉知。
- 檢查異常:重寫方法一定不能拋出新的檢查異常,或比被重寫方法聲明的檢查異常更廣的檢查異常
- 不能重寫標(biāo)志為final,static的方法
重載方法的規(guī)則:
- 參數(shù)列表:被重載的方法必須改變參數(shù)列表。
- 返回類型:可以改變返回類型诗芜。
- 修飾符:可以改變修飾符
- 異常:可以聲明新的或者更廣泛的異常瞳抓。
class Animal {
public void eat(){
}
}
以下列出對于Animal的eat方法各種重寫重載實例,根據(jù)以上列出的規(guī)則伏恐,判斷其是否合法(以下的方法都屬于Animal的子類Horse的方法):
-
private void eat(){}
不能通過編譯孩哑,非法重寫,訪問修飾符限制性變強翠桦;不屬于重載横蜒,因為參數(shù)列表沒有發(fā)生改變 -
public void eat() throw RuntimeException{}
能通過編譯,屬于重寫销凑,重寫方法可以拋出任何非檢查異常丛晌。 -
public void eat() throw IOException{}
不能通過編譯,非法重寫斗幼,重寫方法一定不能拋出新的檢查異常澎蛛,或比被重寫方法聲明的檢查異常更廣的檢查異常;不屬于重載蜕窿,參數(shù)列表必須發(fā)生變化才屬于重載 -
public void eat(String food){}
能通過編譯谋逻,不是重寫;合法重載桐经,因為參數(shù)列表發(fā)生改變了毁兆。 -
public String eat(){}
不能通過編譯,不是重寫次询,因為其返回類型荧恍;不是重載,因為參數(shù)列表沒有發(fā)生改變屯吊。 -
public String eat(int n){}
可以通過編譯送巡,不是重寫;是重載盒卸,首先參數(shù)列表必須發(fā)生變化骗爆,返回類型可以發(fā)生改變。
對父類被重寫的方法做一個變動:
class Animal {
public Animal eat() throws IOException{
return null;
}
}
-
public Animal eat(){return null;}
可以通過編譯蔽介,合法重寫摘投,可以不拋出異常,只要不拋出新的異澈缧睿或更廣泛的異常就可以犀呼。 -
public Animal eat() throws FileNotFoundException{return null;}
可以通過編譯,是重寫薇组,屬于子類的非檢查異常外臂。 -
public Animal eat() throws Exception{}
不可以通過編譯,非法重寫律胀,拋出了更廣泛的異常宋光。 -
public Horse eat() {}
可以通過編譯貌矿,是重寫,因為返回類型可以是被重寫的返回類型的子類罪佳。
重載(Overloading)
方法重載是讓類以統(tǒng)一的方式處理不同類型數(shù)據(jù)的一種手段逛漫。多個同名函數(shù)同時存在,具有不同的參數(shù)個數(shù)/類型赘艳。重載Overloading是一個類中多態(tài)性的一種表現(xiàn)酌毡。
Java的方法重載,就是在類中可以創(chuàng)建多個方法蕾管,它們具有相同的名字阔馋,但具有不同的參數(shù)和不同的定義。調(diào)用方法時通過傳遞給它們的不同參數(shù)個數(shù)和參數(shù)類型來決定具體使用哪個方法, 這就是多態(tài)性娇掏。、
重載的時候勋眯,方法名要一樣婴梧,但是參數(shù)類型和個數(shù)不一樣,返回值類型可以相同也可以不相同客蹋。無法以返回型別作為重載函數(shù)的區(qū)分標(biāo)準(zhǔn)塞蹭。
重寫(Overriding)
父類與子類之間的多態(tài)性,對父類的函數(shù)進行重新定義讶坯。如果在子類中定義某方法與其父類有相同的名稱和參數(shù)番电,我們說該方法被重寫 (Overriding)。在Java中辆琅,子類可繼承父類中的方法漱办,而不需要重新編寫相同的方法。
但有時子類并不想原封不動地繼承父類的方法婉烟,而是想作一定的修改娩井,這就需要采用方法的重寫。方法重寫又稱方法覆蓋似袁。若子類中的方法與父類中的某一方法具有相同的方法名洞辣、返回類型和參數(shù)表,則新方法將覆蓋原有的方法昙衅。如需父類中原有的方法扬霜,可使用super關(guān)鍵字,該關(guān)鍵字引用了當(dāng)前類的父類而涉。
子類函數(shù)的訪問修飾權(quán)限不能少于父類的著瓶;
總結(jié):重載和重寫(覆蓋)
- 方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)。重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn)婴谱,重載Overloading是一個類中多態(tài)性的一種表現(xiàn)蟹但。如果在子類中定義某方法與其父類有相同的名稱和參數(shù)躯泰,我們說該方法
被重寫 (Overriding)。子類的對象使用這個方法時华糖,將調(diào)用子類中的定義麦向,對它而言,父類中的定義如同被“屏蔽”了客叉,而且如果子類的方法名和參數(shù)類型和個數(shù)都和父類相同诵竭,那么子類的返回值類型必須和父類的相同;如果在一個類中定義了多個同
名的方法兼搏,它們或有不同的參數(shù)個數(shù)或有不同的參數(shù)類型卵慰,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型佛呻。也就是說裳朋,重載的返回值類型可以相同也可以不同。