方法的覆蓋(重寫)

關於封裝、繼承和多態的概念這裏就不再贅述,本文只描述方法覆蓋(重寫)的條件及限制。
 一:關於方法的覆蓋

    1.什麼時候方法要進行重寫?
        如果父類中的方法已經無法滿足當前子類的業務需求,需要將父類中的方法進行重新寫一遍。

    2.子類如果重寫父類中的方法之後,子類對象一定調用的是重寫之後的方法。

    3.發生方法覆蓋的條件:
  • 發生在具有繼承關係的兩個類之間
  • 必須具有相同的方法名,相同的返回值類型,相同的參數列表.
  • 重寫的方法不能比被重寫的方法擁有更低的訪問權限。
  • 重寫的方法不能比被重寫的方法拋出更寬泛的異常。(異常機制再講。)
  • 私有的方法不能被覆蓋。
  • 構造方法無法被覆蓋。因爲構造方法無法被繼承。
  • 靜態的方法不存在覆蓋。
  • 覆蓋指的是成員方法,和成員變量無關。

    4.繼承最基本的作用:代碼重用。 繼承最重要的作用:方法可以重寫。

public class Test01{
    public static void main(String[] args){

        //創建子類對象
        Cat c = new Cat();

        //調用方法
        c.move();


        Animal a = new Animal();
        a.move();

    }
}

//父類:動物
class Animal{

    //成員方法
    public void move(){
        System.out.println("動物在移動!");
    }

}

//子類:貓
class Cat extends Animal{

    //Cat的move方法應該輸出:貓在走貓步!
    //Animal中的move方法已經無法滿足Cat了。
    //所以要在Cat類中對Animal類中的move方法進行重新定義(方法的覆蓋,方法的重寫,Overwrite,Override)
    public void move(){
        System.out.println("貓在走貓步!");
    }

}



    私有的方法無法被覆蓋
//父類
class A{

    //私有方法
    private void m1(){
        System.out.println("A'm1 method invoke!");
    }

    //入口
    public static void main(String[] args){

        //多態
        A a = new B();

        a.m1(); //A'm1 method invoke!
    }
}


//子類
class B extends A{
    //嘗試重寫父類私有的方法
    public void m1(){
        System.out.println("B'm1 method invoke!");
    }
}
    靜態的方法不存在覆蓋
public class Test03{

    public static void main(String[] args){

        A a = new B();
        //靜態方法不存在覆蓋,因爲靜態方法執行和對象無關。
        a.m1(); //A's m1 method invoke!

        A.m1();
        B.m1();
    }
}

class A{

    //靜態方法
    public static void m1(){
        System.out.println("A's m1 method invoke! ");
    }
}
class B extends A{

    //嘗試重寫父類的靜態方法
    public static void m1(){
        System.out.println("B's m1 method invoke! ");
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章