重寫(Override)
重寫是子類對父類的允許訪問的方法的實現(xiàn)過程進行重新編寫, 返回值和形參都不能改變院促。即外殼不變,核心重寫厂捞!
重寫的好處在于子類可以根據(jù)需要睁本,定義特定于自己的行為。 也就是說子類能夠根據(jù)需要實現(xiàn)父類的方法啡莉。
重寫方法不能拋出新的檢查異掣圩迹或者比被重寫方法申明更加寬泛的異常。例如: 父類的一個方法申明了一個檢查異常 IOException票罐,但是在重寫這個方法的時候不能拋出 Exception 異常叉趣,因為 Exception 是 IOException 的父類,只能拋出 IOException 的子類異常该押。
在面向?qū)ο笤瓌t里疗杉,重寫意味著可以重寫任何現(xiàn)有方法。
重載(Overload)
重載是在一個類里面蚕礼,方法名字相同烟具,而參數(shù)不同。返回類型可以相同也可以不同奠蹬。
每個重載的方法(或者構(gòu)造函數(shù))都必須有一個獨一無二的參數(shù)類型列表朝聋。
最常用的地方就是構(gòu)造器的重載。
重載規(guī)則:
- 被重載的方法必須改變參數(shù)列表(參數(shù)個數(shù)或類型不一樣)囤躁;
- 被重載的方法可以改變返回類型冀痕;
- 被重載的方法可以改變訪問修飾符;
- 被重載的方法可以聲明新的或更廣的檢查異常狸演;
- 方法能夠在同一個類中或者在一個子類中被重載言蛇。
- 無法以返回值類型作為重載函數(shù)的區(qū)分標(biāo)準(zhǔn)。
總結(jié)
方法的重寫和重載是java多態(tài)性的不同表現(xiàn)宵距,重寫是父類與子類之間多態(tài)性的一種表現(xiàn)腊尚,重載可以理解成多態(tài)的具體表現(xiàn)形式。
- 方法重載是一個類中定義了多個方法名相同,而他們的參數(shù)的數(shù)量不同或數(shù)量相同而類型和次序不同,則稱為方法的重載(Overloading)满哪。
- 方法重寫是在子類存在方法與父類的方法的名字相同,而且參數(shù)的個數(shù)與類型一樣,返回值也一樣的方法,就稱為重寫(Overriding)婿斥。
-
方法重載是一個類的多態(tài)性表現(xiàn),而方法重寫是子類與父類的一種多態(tài)性表現(xiàn)。
來個小測試哨鸭,代碼如下:
class A {
public String show(D obj){
return ("A and D");
}
public String show(A obj){
return ("A and A");
}
}
class B extends A{
public String show(A obj){
return ("B and A");
}
public String show(B obj){
return ("B and B");
}
}
class C extends B{}
class D extends B{}
public class MultiTest{
public static void main(String[] args){
A ab = new B();
B b = new B();
C c = new C();
System.out.println(ab.show(b));
System.out.println(ab.show(c));
}
}
運行代碼結(jié)果如下:
B and A
B and A
分析:
Overload 是由編譯器在編譯時決定的民宿,因為 ab 的聲明類型為 A,所以會調(diào)用 show(A obj) 方法像鸡,編譯類型一致勘高。
Override 是多態(tài),由運行時實際類決定,所以調(diào)用的是B類的方法而不是A類的方法华望。
這個涉及到了java的多態(tài)中的向上轉(zhuǎn)型蕊蝗,簡單來說,父類引用生成子類對象赖舟,那這個引用只能調(diào)用在父類中已經(jīng)定義過的屬性和方法蓬戚,而對子類自己新定義的屬性和方法則不能訪問。比如這里的A ab=new B();,ab是一個父類引用宾抓,之后執(zhí)行ab.show(b),這時ab先從父類中查找方法子漩,與之匹配的只有show(A obj)方法,而且發(fā)現(xiàn)子類重寫了該方法石洗,這時動態(tài)鏈接到子類的show(A obj)方法幢泼。
假如你執(zhí)行b.show(c),這里,b中有show(A obj)方法和show(B obj)方法讲衫,繼承層次為C->B->A缕棵,根據(jù)重載的最近匹配原則,會調(diào)用show(B obj)方法涉兽。
自己在eclipse中寫了上面的代碼招驴,利用eclipse的自動提示方法調(diào)用功能,看了下對方法的提示枷畏,如下圖:
可以看到别厘,提示的是A類中的兩個方法,而不是B類中的兩個方法拥诡,編譯的時候看的是引用類型触趴,運行的時候調(diào)用的是實際類型。