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

來源:互聯網
上載者:User

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

        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("子類");    }}輸出:基類

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.