繼承中靜態方法不能被重寫


本文鏈接:https://blog.csdn.net/gao_zhennan/article/details/72892946

解釋的很清楚

答案很明確:java的靜態方法不能被重寫。
靜態成員(方法或屬性)是類的成員存放在棧中,類可以直接調用(是屬於類的靜態成員,當然對象也可以調用,只是說你可以使用而已);實例成員是對象的成員,存放在堆中,只能被對象調用。
重寫的目的在於根據創造對象的所屬類型不同而表現出多態。因為靜態方法無需創建對象即可使用。沒有對象,重寫所需要的“對象所屬類型” 這一要素不存在,因此無法被重寫。

千言萬語,不如代碼:

class A{
    public static show(){
        System.out.println(" Static Method of A");
    }
}
class B extends A{
    public static show(){
        System.out.println("Static Method of B");

    }
}

結果,很明顯了。如果是重寫的話,x.show的結果應該是Static Method of B,從運行結果來看show的結果是和對象的應用及所屬類有關。所以說靜態成員是屬於類的。

那么,怎么描述B中的show和A中的show的關系呢?不是重寫,其實也不是重載(驗證方法參照上面的代碼)
其實他們的關系可以成為:重定義!即重新定義類中的成員。
舉個例子:
1子類重新定義從超類獲得的屬性

class A { public int x=5;}
class B extends A{ public boolean x=true;}
A a=new B(); B b=new B();

由於B中重新定義了名為x的屬性,從A中繼承而來的X就被屏蔽了。但依然存在,可以通過super.x來獲得其值
2,子類定義的方法與超類的私有方法或者靜態方法同名
對超類的私有方法。由於無法派生給子類,因此子類在定義與該類方法同名的方法時不存在任何前提限制。另外,靜態方法不能重寫但能重定義!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM