前言
對於Java的基礎知識,很多內容都是熟悉又陌生的,總覺得當時是理解了,過一段時間再分享的時候卻有些詞不達意,說明對於這個知識的理解還是不到位,今天特地記錄下來。
問題
1、重寫是什麼?
2、重載是什麼?
3、重載與重寫的區別是什麼?
4、爲什麼要把它們兩個進行比較?
解答
重寫是什麼?
子類包含與父類同名方法的現象被稱爲方法重寫(Override),也被稱爲方法覆蓋。
具體可以說是子類將與父類同名方法中的方法體進行重寫,但是方法名、參數列表、返回類型都不變。
父類:Bird類
public class Bird
{
// Bird類的fly方法
public void fly(){
System.out.println("我在天空自由自在的飛翔……");
}
}
子類:Ostrich類
public class Ostrich extends Bird
{
// 重寫Bird類的fly方法
public void fly(){
System.out.println("我只能在地上奔跑……");
}
public static void main(String[] args){
// 創建Ostrich對象
Ostrich os = new Ostrich();
// 執行Ostrich對象的fly方法,將輸出“我只能在地上奔跑……”
os.fly();
}
}
執行上面的程序將看到os.fly()執行時不再執行Bird類的方法,而是執行Ostrich類的fly()方法。
兩同兩小一大
方法的重寫要遵循“兩同兩小一大”規則。
- 兩同:方法名相同,形參列表相同
- 兩小:子類方法返回值類型應比父類方法返回值類型小或相等
- 子類方法聲明拋出的異常類應比父類方法聲明拋出的異常類小或相等
- 一大:子類方法的訪問權限應比父類方法的訪問權限更大或相等
特性
父類與子類之間的多態性,即在子類中重寫該方法——相同方法名,相同參數,不同實現(運行時多態性)。
當子類覆蓋了父類方法後,子類的對象將無法訪問父類中被覆蓋的方法,但可以子類方法中調用父類中被覆蓋的方法。——使用super可解決
重載是什麼?
Java允許同一個類裏定義多個同名方法,只要形參列表不同就行。如果同一個類中包含了兩個或兩個以上方法的方法名相同,但形參列表不同,則被稱爲方法重載。
public class Overload
{
// 下面定義兩個test()方法,但方法的參數列表不同
public void test(){
System.out.println("無參數");
}
public void test(String msg){
System.out.println("重載的test方法" + msg);
}
public static void main(String[] args){
Overload ol = new Overload();
// 調用test()時沒有傳入參數,因此係統調用上面沒有參數的test()方法
ol.test();
// 調用test()時傳入了一個字符串參數
// 因此係統調用上面帶一個字符串參數的test()方法
ol.test("abc");
}
}
兩同一不同
- 兩同:同一個類中方法名相同
- 不同:參數列表不同
至於其他部分,例如方法返回類型等不能作爲區分方法重載的方法
爲什麼呢?
對於int f(){}和void f(){}兩個方法,如果這樣調用:
int result = f();
系統是知道調用的是哪一個方法,但是Java中調用方法時,是可以省略方法返回值,即這樣調用:
f();
這樣的話就不能區分到底調用了哪一個方法,人尚且無法區分,系統又怎麼能夠判斷調用哪一個呢?
特性
重載Overload是一個類中多態性的表現——同類同方法名,不同參數列表(編譯時多態性)
重寫與重載的區別是什麼?
方法的重載和重寫都是多態性的一種體現,前者是編譯時多態性,後者是運行時多態性。
重載發生在同一類中,要求方法名相同,參數列表不同。重載對返回類型沒有特殊要求,不能根據返回類型進行區分。
重寫則發生在具有父子關係的類中,要求方法名相同,參數相同,具體實現不同。並且對於返回類型和異常拋出以及訪問權限均有限制,具體可詳見上面描述。
爲什麼要進行比較?
它們兩者本身沒有太大的比較意義,除了二者都是發生在方法之間,並要求方法名相同之外,並沒有太多的相似之處。但是從多態的角度去思考的話,還有值得我們推敲的內容。
小結
當然,父類方法和子類方法之間也可能發生重載,因爲子類會獲得父類的方法,如果子類定義了一個與父類方法有相同的方法名,但參數列表不同的方法,就會發生父類與子類之間的方法重載。
參考文章:Java—重寫與重載的區別
瘋狂Java講義第4版
感謝您的閱讀~~