子類爲什麼不能重寫父類的靜態方法

"重寫"只能適用於實例方法.不能用於靜態方法.對於靜態方法,只能隱藏(形式上被重寫了,但是不符合的多態的特性),“重寫”是用來實現多態性的,只有實例方法是可以實現多態,而靜態方法無法實現多態。例如:

        Employee man = new Manager();

        man.test();

   實例化的這個對象中,聲明的man變量是Employee類的,變量名存在棧中,而內存堆中爲對象申請的空間卻是按照Manager類來的,就是Employee類型的man變量的指針指向了一個Manager類的對象。如果對這個man調用方法,調用的是誰的?如果是非靜態方法,編譯時編譯器以爲是要調用Employee類的,可是實際運行時,解釋器就從堆上開工了,實際上是從Manager類的那個對象上走的,所以調用的方法實際上是Manager類的方法。有這種結果關鍵在於man實際上指向了Manager類對象。現在用man來調用靜態方法,實際上此時是Employee類在調用靜態方法,Employee類本身肯定不會指向Manager類的對象,那麼最終調用的是Employee類的方法。

   由此,只能說形式上靜態方法的卻可以被重寫,實際上達不到重寫的效果,從多態的角度可以認爲子類實際上是寫了一個新方法,從這個角度上說靜態方法無法被重寫。那麼也就證明了重寫和覆蓋就是一回事。

例如:

public class TestStaticMethodExtends {
    
    public static void main(String[] args) {
       A a = new B();
        a.p();
    }
}

class A {
    public static void p() {
        System.out.println("基類");
    }
}

class B extends A {
    public static void p() {
        System.out.println("子類");
    }
}

輸出:基類




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