Java子類對於父類中static方法的繼承


 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM