首先我們來測試,猜下下面程序的運行結果...
1 // 該類測試靜態方法為什么不能被重寫 2 public class Test1_Static { 3 4 public static void main(String[] args) { 5 Father f = new Father(); 6 f.staticMethod(); 7 Child c = new Child(); 8 c.staticMethod(); 9 Father person = new Child(); 10 person.staticMethod(); 11 12 } 13 } 14 15 16 class Father { 17 public static void staticMethod() { 18 System.out.println("fatherMethod"); 19 } 20 } 21 22 class Child extends Father{ 23 public static void staticMethod() { 24 System.out.println("childMethod"); 25 } 26 }
打印結果:
fatherMethod
childMethod
fatherMethod
相信前兩個打印結果大家都已經猜到了,但是最后一個結果相信有不少小伙伴會產生疑惑,甚至做出錯誤的判斷,其實一個指向子類對象的父類引用變量來調用父子同名的靜態方法時,只會調用父類的靜態方法。這是因為靜態方法只能被繼承,不能被重寫,如果子類有和父類相同的靜態方法,那么父類的靜態方法將會被隱藏,對於子類不可見,也就是說,子類和父類中相同的靜態方法是沒有關系的方法,他們的行為不具有多態性。但是父類的靜態方法可以通過父類.方法名調用。
這個文檔也不錯,可參考下:關於靜態方法為什么不能被重寫的一點思考以及overload的一些坑。