- 結論:java中靜態屬性和靜態方法可以被繼承,但是沒有被重寫(overwrite)而是被隱藏.
- 原因:
- 1). 靜態方法和屬性是屬於類的,調用的時候直接通過類名.方法名完成對,不需要繼承機制及可以調用。如果子類里面定義了靜態方法和屬性,那么這時候父類的靜態方法或屬性稱之為"隱藏"。如果你想要調用父類的靜態方法和屬性,直接通過父類名.方法或變量名完成,至於是否繼承一說,子類是有繼承靜態方法和屬性,但是跟實例方法和屬性不太一樣,存在"隱藏"的這種情況。
- 2). 多態之所以能夠實現依賴於繼承、接口和重寫、重載(繼承和重寫最為關鍵)。有了繼承和重寫就可以實現父類的引用指向不同子類的對象。重寫的功能是:"重寫"后子類的優先級要高於父類的優先級,但是“隱藏”是沒有這個優先級之分的。
- 3). 靜態屬性、靜態方法和非靜態的屬性都可以被繼承和隱藏而不能被重寫,因此不能實現多態,不能實現父類的引用可以指向不同子類的對象。非靜態方法可以被繼承和重寫,因此可以實現多態。
1 package com.wyy.test; 2 3 public class StaticMethodTest { 4 public static void main(String[] args){ 5 Parent p = new Parent(); 6 Parent son = new Son(); 7 p.getName(); 8 son.getName(); 9 p.getDesc(); 10 son.getDesc(); 11 } 12 } 13 class Parent{ 14 public static String name ; 15 public String desc; 16 public static void getName(){ 17 name = "father"; 18 System.out.println(name); 19 } 20 public void getDesc(){ 21 desc = "father's Desc"; 22 System.out.println(desc); 23 } 24 } 25 26 class Son extends Parent{ 27 public static void getName(){ 28 name = "son"; 29 System.out.println(name); 30 } 31 public void getDesc(){ 32 desc = "son's Desc"; 33 System.out.println(desc); 34 } 35 }
輸出結果為:
father
father
father's Desc
son's Desc