複製鏈接
請複製以下鏈接發送給好友

方法重寫

鎖定
Java和其他一些高級面向對象的編程語言中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類並不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要採用方法的重寫。方法重寫又稱方法覆蓋。
中文名
方法重寫
外文名
overiding method
領    域
Java
又    稱
方法覆蓋

方法重寫方法重寫概念

方法的重寫是指兩個方法的返回值、方法名、參數的類型和個數相同(子類重寫父類的方法)。
方法的重寫,不能發生在同類中,只能發生在子類中。
若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數表,則新方法將覆蓋原有的方法。 如需父類中原有的方法,可使用super關鍵字,該關鍵字引用了當前類的父類。
方法重寫的權限:子類中的權限大於或等於父類的權限,(修飾符高低:private<默認修飾符<protected<public)
特殊情況:子類不能重寫父類被聲明為private權限的方法

方法重寫注意事項

方法重寫方法的隱藏

如果子類中定義的靜態方法(類方法)與父類中靜態方法(類方法)具有相同的返回值類型、方法名、方法參數的類型和個數完全相同,則稱子類中的該方法“隱藏”了父類中的該方法。當子類創建的對象調用該隱藏方法時,默認調用的是子類中的方法。

方法重寫方法重寫與方法重載區別

方法的重載是方法的參數個數或類型不同,方法名相同。
方法重寫是要注意權限的問題,子類中的權限不能小於父類的權限,當父類的權限為private時,子類無法繼承。也就無法產生所謂的重寫。(修飾符高低:private<默認修飾符<public)

方法重寫特性

關於方法重寫的一些特性:
1.發生方法重寫的兩個方法返回值、方法名、參數列表必須完全一致(子類重寫父類的方法)
2.子類拋出的異常下不能超過父類相應方法拋出的異常(子類異常不能大於父類異常)
3.子類方法的訪問級別不能低於父類相應方法的訪問級別(子類訪問級別不能低於父類訪問級別)
根據2,3條可以確定第一條,子類重寫父類方法的返回值類型不能大於父類方法的返回值類型,即是説子類方法的返回值必須和父類方法的返回值相同或是其子類。

方法重寫示例

public class Father {
    public static String name1 ="父類的類變量";
    public String name2 ="父類的實例變量名";
    //定義一個類方法
    public static void classMethod(){
        System.out.println("Father父類通過類方法調用它的類變量:"+name1);
    }
    //定義一個實例方法
    public void instanceMethod(){
        System.out.println("Father父類通過實例方法調用它的實例變量:"+name2);
    }
}
public class Son extends Father{
    public static String name1 ="子類的類變量";
    public String name2 ="子類的實例變量";
    //定義一個類方法
    public static void classMethod(){
        System.out.println("Son子類通過類方法調用它的類變量:"+name1);
    }
    //定義一個實例方法
    public void instanceMethod(){
        System.out.println("Son子類通過實例方法調用它的實例變量:"+name2);
    }
}
public class Test {
    public static void main(String[] args) {
        System.out.println("\n-----------------------------------------");
        Son mySon1 =new Son();
        Father myFather1=mySon1;//對象類型轉換的上轉型
        myFather1.instanceMethod();
        
        System.out.println("\n------------------------------------");
        Father myFather2=new Father();
        if(myFather2 instanceof Son){
          //隱式對象類型轉換
         Son mySon2 =(Son) myFather2;
         //調用myFather對象的實例方法
         mySon2.instanceMethod();
        }
    }
}