今天看到了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
