JAVA繼承時方法的重載(overload)與重寫/覆寫(override)
重載-Override
函數的方法參數個數或類型不一致,稱為方法的重載。
從含義上說,只要求參數的個數或參數的類型不一致就說兩個函數是重載函數,而至於返回值是否一樣,沒關系。同時,重載可以發生在同一個類中也可以發生在繼承關系中。
class A { } class B extends A { public void fun(String data1) { System.out.println(data1); } public String fun(String data1, String data2) { System.out.println(data1 + "-->" + data2); return ""; } }
上面的代碼說明了在同一個類中的方法重載。此外,如果我們把第一個函數移到A類中,也構成了重載關系。
class A { public void fun(String data1) { System.out.println(data1); } } class B extends A { public String fun(String data1, String data2) { System.out.println(data1 + "-->" + data2); return ""; } }
重寫-Override
重寫也被稱為覆寫。對一個方法的重寫必須發生在具有繼承關系的兩個類中,即子類對父類方法的重寫。它要求兩個方法的參數個數和類型以及返回值類型都必須一致,這樣才稱為方法重寫。
class A { public void fun(String data) { System.out.println(data); } } class B extends A { public void fun(String data) { System.out.println("XXXX" + data); } }
上面代碼演示了子類對父類方法的覆寫。可以看到兩個函數的參數個數和類型以及返回值都是一致的。
同時子類對父類的方法覆寫對權限有要求,子類方法的訪問權限必須大於或等於父類方法的訪問權限。也就是說如果父類方法的訪問權限是default,那么子類必須是default或者public,如果父類方法是public訪問權限,那么子類就只能是public訪問權限了。然而,實際開發中,絕大多數的方法都是public訪問權限,所以覆寫方法也是public。
關於訪問權限,還有一點需要注意的是,父類方法如果是private,根據JAVA的封裝性原則,private是不讓其它任何類訪問的。那么,此時子類能否對父類的private方法進行覆寫呢?
答案是否定的。
class A { public void test() { fun(); } private void fun() { System.out.println("父類的private fun()"); } } class B extends A { public void fun() { System.out.println("子類的public fun()"); } } public class Hello { public static void main(String[] args) throws Exception { B b = new B(); b.test(); } }
此時運行結果是調用的父類的private fun()方法。
所以,此時對重載和覆寫做一個總結:
| 比較項目 |
重載 |
覆寫/重寫 |
| 英文名 |
Overload |
Override |
| 函數簽名 |
只要求函數的參數個數或類型不一致,對返回值沒要求 |
函數的參數個數、類型、返回值都必須完全一樣。 |
| 發生地方 |
同一個類或者具有繼承關系的兩個類中 |
只能發生在繼承關系的兩個類中 |
| 訪問權限 |
沒有限制 |
子類覆寫方法的訪問權限必須大於或等於父類的方法的訪問權限 |
