本文鏈接: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,子類定義的方法與超類的私有方法或者靜態方法同名
對超類的私有方法。由於無法派生給子類,因此子類在定義與該類方法同名的方法時不存在任何前提限制。另外,靜態方法不能重寫但能重定義!