你不知道的Java重寫

船頭尺發表於2021-09-09

我猜這個知識點你可能會弄錯。

重寫:兩個方法有相同的名稱和相同的引數,其中一個方法位於子類,另一個方法位於這個子類的父類中。重寫讓子類可以在父類的基礎上實現跟你更多的功能,或者實現自己的功能。

多說兩句,重寫是針對方法的,針對成員變數的重寫有試過嗎?

案例

看一下下面的程式碼,猜一下執行的結果是什麼。

class Super {
    String s = "老";

    public String bark(){
        return s;
    }
}

class Sub extends Super {
    String s = "兒子";

    @Override
    public String bark() {
        return s;
    }
}

public class FieldOverriding {
    public static void main(String[] args) {
        Sub c1 = new Sub();
        System.out.println(c1.s);
        System.out.println(c1.bark());

        Super c2 = new Sub();
        System.out.println(c2.s);
        System.out.println(c2.bark());
    }
}

定義:在一個類中,成員變數的名稱和父類相同的時候會隱藏父類的成員比那裡,儘管型別不同。在子類中,父類的成員變數不能透過變數名字來引用。只能,透過它的父類來訪問。
最後:我們不建議這麼做,這樣會讓程式碼閱讀變得困難。

執行結果:

兒子      // c1.s
兒子      // c1.bark()
老      // c2.s
兒子      // c2.bark

分析

c1和c2是相同的物件,也就是相同的class,但是c2.s為父類的內容,意味著父類和子類的成員變數都是存在的。
我們也可以這樣訪問:

((Super) c2).s      //注意這裡的Super不是Java的關鍵字。

額外

重寫和過載都會放在一起唄提到,初學者也經常弄混淆兩者的概念。

過載:兩個或更多個有相同的名稱,但是有不同的引數。(引數個數不同,引數型別不同),與方法的返回值無關,與許可權修飾符無關。型別,個數,順序

最後

這個概念在Java的官方文件中有提到,想把Java搞明白,還是要閱讀官方文件,最一手的資料。
有沒有覺得這個知識點很偏呢...

參考:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3016/viewspace-2802849/,如需轉載,請註明出處,否則將追究法律責任。

相關文章