#結論:java中靜態屬性和靜態方法可以被繼承,但是沒有被重寫(overwrite)而是被隱藏。
原因:
1、靜態方法和屬性是屬於類別的,呼叫的時候直接透過類別名稱.方法名稱完成,不需要繼承機制便可以呼叫。
如果子類別裡面定義了靜態方法和屬性,那麼這時候父類別的靜態方法或屬性稱之為"隱藏"。如果你想要呼叫父類別的靜態方法和屬性,直接透過父類別名稱.方法或變數名稱完成,至於是否繼承一說,子類別是有繼承靜態方法和屬性,但是跟實例方法和屬性不太一樣,存在"隱藏"的這種情況。
2、多態之所以能夠實現依賴繼承、介面和重寫、重載(繼承和重寫最為關鍵)。有了繼承和重寫就可以實現父類別的引用指向不同子類別的物件。
重寫的功能是:"重寫"後子類別的優先權要高於父類別的優先權,但是「隱藏」是沒有這個優先權之分的。
範例如下:
package com.study.test; public class A { //父类 public static String staticStr = "A静态属性"; public String nonStaticStr = "A非静态属性"; public static void staticMethod(){ System.out.println("A静态方法"); } public void nonStaticMethod(){ System.out.println("A非静态方法"); } }
package com.study.test; public class B extends A{//子类B public static String staticStr = "B改写后的静态属性"; public String nonStaticStr = "B改写后的非静态属性"; public static void staticMethod(){ System.out.println("B改写后的静态方法"); } }
package com.study.test; public class C extends A{//子类C继承A中的所有属性和方法 }
package com.study.test; public class StaticExtendsTest { public static void main(String[] args) { C c = new C(); System.out.println(c.nonStaticStr); System.out.println(c.staticStr); c.staticMethod();//输出的结果都是父类中的非静态属性、静态属性和静态方法,推出静态属性和静态方法可以 被继承 System.out.println("-------------------------------"); A c1 = new C(); System.out.println(c1.nonStaticStr); System.out.println(c1.staticStr); c1.staticMethod();//结果同上,输出的结果都是父类中的非静态属性、静态属性和静态方法,推出静态属性和 静态方法可以被继承 System.out.println("-------------------------------"); B b = new B(); System.out.println(b.nonStaticStr); System.out.println(b.staticStr); b.staticMethod(); System.out.println("-------------------------------"); A b1 = new B(); System.out.println(b1.nonStaticStr); System.out.println(b1.staticStr); b1.staticMethod();//结果都是父类的静态方法,说明静态方法不可以被重写,不能实现多态 } }
推薦教學:java快速入門
#以上是java中的靜態方法可以被繼承麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!