Java的重寫

1、什麼是重寫java

  在子類中建立了一個與父類中名稱相同、返回值類型相同、參數列表的方法相同,只是方法體中的實現不一樣,以實現不一樣於父類的功能,這種方式被稱爲方法重寫(override),又稱爲方法覆蓋、方法複寫。ide

2、爲何須要重寫idea

  原有的方法沒法知足新的需求,須要對這個方法進行改良來知足新的需求。重寫是出如今子類繼承父類方法中。能夠看出,重寫就是子類繼承的父類方法沒法知足子類的新的功能需求,子類對父類的這個方法進行改良重寫的一種方式。子類能夠根據須要,定義特定於本身的行爲。既沿襲了父類的功能名稱,又根據子類的須要從新實現父類方法,從而進行擴展加強。spa

3、重寫的條件/規則對象

  1.  重寫只跟非靜態方法(成員方法)有關,而與靜態方法無關:

靜態方法和非靜態方法是不同的:在靜態方法中,方法的調用只和左邊聲明的對象類型有關,而與右邊無關,是哪一個類型,就調用對應的方法。blog

 同時,靜態方法是在idea中沒法使用快捷鍵(Alt+Insert==》選擇Overrider Methods)快速的生成重寫的方法:繼承

  非靜態方法:虛擬機

 非靜態方法能夠由idea建立重寫的方法:io

 

   總結:編譯

  • 父類的成員方法只能被它的子類重寫。
  • 聲明爲 static 的方法不能被重寫,可是可以再次聲明。

  2.     方法名必須相同;

    返回的類型必須與被重寫的方法的返回類型相同

    參數列表必須相同;

    修飾符:範圍能夠擴大但不能縮小:public>Protected>Default;

    拋出的異常:範圍,能夠被縮小,但不能擴大

       子類的方法和父類必要一致;方法體不一樣!;

  每種動物都有名字和年齡屬性,可是喜歡吃的食物是不一樣的,好比狗喜歡吃骨頭、貓喜歡吃魚等,所以每種動物的介紹方式是不同的。Dog經過重寫Animal的方法來表現狗特有的行爲特徵。

Animal父類:

public class Animal {
    public void shout(){
        System.out.println("動物都會叫");
    }
    void move(){
        System.out.println("動物都會走");
    }
    protected void eat(String food){
        System.out.println("動物都會吃食物");
    }
    private void breed(){
        System.out.println("動物須要繁衍");
    }
}

  Dog子類:

public class Dog extends Animal{
    @Override
    public void shout() {
        System.out.println("汪汪汪");
    }

    @Override
    void move() {
        System.out.println("狗用四隻腿跑");
    }

    @Override
    protected void eat(String food) {
        System.out.println("啃骨頭");
        System.out.println("狗還要吃"+food);
    }
}

  對類進行實例化:

public class AnimalTest {
    public static void main(String[] args) {
        Animal a = new Animal();
        //儘管 b 屬於 Animal 類型,可是它運行的是 Dog 類的 move方法
        Animal b = new Dog();

        a.shout();
        a.move();
        a.eat("水");
        //a.breed();  私有屬性,沒法在類之外使用

        b.shout();
        b.move();
        b.eat("肉");
    }
}

  在上面的例子中能夠看到,儘管 b 屬於 Animal 類型,可是它運行的是 Dog 類的方法。這是因爲在編譯階段,只是檢查參數的引用類型然而在運行時,Java 虛擬機(JVM)指定對象的類型而且運行該對象的方法。所以在上面的例子中,之因此能編譯成功,是由於 Animal 類中存在 move 方法,然而運行時,運行的是特定對象的方法。

以上實例編譯運行結果以下

動物都會叫
動物都會走
動物都會吃食物
汪汪汪
狗用四隻腿跑
啃骨頭
狗還要吃肉

4、重寫的注意事項

  1. 重寫的方法可使用 @Override 註解來標識。
  2. 構造方法不能被重寫。
  3. 聲明爲 final 的方法不能被重寫。
  4. 子類和父類在同一個包中時,子類能夠重寫父類除了聲明爲 privatefinal 方法的其餘方法。
  5. 子類和父類不在同一個包中時,子類只能重寫父類的聲明爲 publicprotected 的非 final 方法。
  6. 若是不能繼承一個方法,則不能重寫這個方法。重寫是在繼承的基礎上,若是方法沒法被繼承那麼就沒法重寫

5、super關鍵字的使用

  當須要在子類中調用父類的被重寫方法時,要使用 super 關鍵字。

public class Animal {
    public void shout(){
        System.out.println("動物都會叫");
    }
}

  子類調用父類的shout()方法:

public class Dog extends Animal{
    @Override
    public void shout() {
        super.shout();
        System.out.println("汪汪汪");
    }
}

  

public class AnimalTest {
    public static void main(String[] args) {
        Animal b = new Dog();
        b.shout();
    }
}

  

運行結果

動物都會叫
汪汪汪
相關文章
相關標籤/搜索