今天看到了Java中子類繼承父類的一個相關討論,在網上綜合了各家的觀點,寫下了一篇簡短的總結。
問題如下,在父類中含有staic修飾的靜態方法,那么子類在繼承父類以后可不可以重寫父類中的靜態方法呢?
答案是:不能。
很多人可能會提出疑問,因為他們在寫代碼的時候出現過以下代碼,舉例:
父類:Animal.java
public class Animal { public Animal() { } public void run() { System.out.println("動物可以奔跑"); } public static void shout() { System.out.println("動物可以叫"); } }
子類:Dog.java
public class Dog extends Animal { public Dog() { // TODO Auto-generated constructor stub } public static void main(String[] args) { Dog dog = new Dog(); dog.run(); dog.shout(); } @Override public void run() { System.out.println("狗跑得很快"); } public static void shout() { System.out.println("狗的叫聲是汪汪汪"); } }
運行Dog.java結果:
這是不是說明子類實現了對父類中靜態方法的重寫呢?貌似很有道理,然而我們對Dog.java,稍作改動,即將dog向上轉型:
public class Dog extends Animal { public Dog() { // TODO Auto-generated constructor stub } public static void main(String[] args) { Animal dog = new Dog(); dog.run(); dog.shout(); } @Override public void run() { System.out.println("狗跑得很快"); } public static void shout() { System.out.println("狗的叫聲是汪汪汪"); } }
運行結果:
說明子類其實並沒有實現對父類stati方法的重寫,為什么?
在Java中,如果父類含有一個靜態方法,且在子類中也含有一個返回類型,方法名、參數列表等都與之相同的的靜態方法,在子類中只是對父類的該同名方法進行隱藏,並不是重寫。父類與子類含有的其實是兩個沒有關系的方法,兩者的行為不具有多態性。
在上面的例子中,shout方法與類發生了關聯,而不是與特定的類的實例相關聯,它不在乎什么類型的類正在創建它,而僅僅在意引用的類型。在Animal dog = new Dog()中,dog是一個類Dog在內存中的一個Animal類型的引用,如果一個static方法被調用了,jvm不會檢查什么類型正在指向它,他只會調用跟Anima類相關聯的方法的實例。
原文:https://blog.csdn.net/Hanoch_wang/article/details/90299382