方法重寫
方法重寫
在Java和其他一些高級面向對象的編程語言中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類並不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要採用方法的重寫。方法重寫又稱方法覆蓋。
方法的重寫是指兩個方法的返回值、方法名、參數的類型和個數相同(子類重寫父類的方法)。
方法的重寫,不能發生在同類中,只能發生在子類中。
若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數表,則新方法將覆蓋原有的方法。如需父類中原有的方法,可使用super關鍵字,該關鍵字引用了當前類的父類。
方法重寫的許可權:子類中的許可權大於或等於父類的許可權,(修飾符高低:private < 默認修飾符
特殊情況:子類不能重寫父類被聲明為private許可權的方法。
關於方法重寫的一些特性:
1.發生方法重寫的兩個方法返回值、方法名、參數列表必須完全一致(子類重寫父類的方法)
2.子類拋出的異常下不能超過父類相應方法拋出的異常(子類異常不能大於父類異常)
3.子類方法的訪問級別不能低於父類相應方法的訪問級別(子類訪問級別不能低於父類訪問級別)
根據2,3條可以確定第一條,子類重寫父類方法的返回值類型不能大於父類方法的返回值類型,即是說子類方法的返回值必須和父類方法的返回值相同或是其子類。
方法的隱藏
如果子類中定義的靜態方法(類方法)與父類中靜態方法(類方法)具有相同的返回值類型、方法名、方法參數的類型和個數完全相同,則稱子類中的該方法“隱藏”了父類中的該方法。當子類創建的對象調用該隱藏方法時,默認調用的是子類中的方法。
方法重寫與方法重載區別
方法的重載是方法的參數個數或類型不同,方法名相同。
方法重寫是要注意許可權的問題,子類中的許可權不能小於父類的許可權,當父類的許可權為private時,子類無法繼承。也就無法產生所謂的重寫。(修飾符高低:private < 默認修飾符 < public)
1public class Father {
2 public static String name1 ="父類的類變數";
3 public String name2 ="父類的實例變數名";
4 //定義一個類方法
5 public static void classMethod(){
6 System.out.println("Father父類通過類方法調用它的類變數:"+name1);
7 }
8 //定義一個實例方法
9 public void instanceMethod(){
10 System.out.println("Father父類通過實例方法調用它的實例變數:"+name2);
11 }
12}
13public class Son extends Father{
14 public static String name1 ="子類的類變數";
15 public String name2 ="子類的實例變數";
16 //定義一個類方法
17 public static void classMethod(){
18 System.out.println("Son子類通過類方法調用它的類變數:"+name1);
19 }
20 //定義一個實例方法
21 public void instanceMethod(){
22 System.out.println("Son子類通過實例方法調用它的實例變數:"+name2);
23 }
24}
25public class Test {
26 public static void main(String[] args) {
27 System.out.println("\n-----------------------------------------");
28 Son mySon1 =new Son();
29 Father myFather1=mySon1;//對象類型轉換的上轉型
30 myFather1.instanceMethod();
31
32 System.out.println("\n------------------------------------");
33 Father myFather2=new Father();
34 if(myFather2 instanceof Son){
35 //隱式對象類型轉換
36 Son mySon2 =(Son) myFather2;
37 //調用myFather對象的實例方法
38 mySon2.instanceMethod();
39 }
40 }
41}
目錄