Java 類中可以覆蓋靜態方法嗎?

Java技術棧

www.javastack.cn

打開網站看更多優質文章

Java 類中可以覆蓋靜態方法嗎?

不,你不能在Java中覆蓋靜態方法,但在子類中聲明一個完全相同的方法不是編譯時錯誤,這稱爲隱藏在Java中的方法。

你不能覆蓋Java中的靜態方法,因爲方法覆蓋基於運行時的動態綁定,靜態方法在編譯時使用靜態綁定進行綁定。

雖然可以在子類中聲明一個具有相同名稱和方法簽名的方法,看起來可以在Java中覆蓋靜態方法,但實際上這是方法隱藏。

Java不會在運行時解析方法調用,並且根據用於調用靜態方法的 Object 類型,將調用相應的方法。

這意味着如果你使用父類的類型來調用靜態方法,那麼原始靜態將從父類中調用,另一方面如果你使用子類的類型來調用靜態方法,則會調用來自子類的方法。父類強制轉換子類原則,這篇推薦看下。

簡而言之,你無法在Java中覆蓋靜態方法。如果你使用像Eclipse或Netbeans這樣的Java IDE,它們將顯示警告靜態方法應該使用類名而不是使用對象來調用,因爲靜態方法不能在Java中重寫。

/**  
 *  
 * Java program which demonstrate that we can not override static method in Java.  
 * Had Static method can be overridden, with Super class type and sub class object  
 * static method from sub class would be called in our example, which is not the case.  
 */  
public class CanWeOverrideStaticMethod {  

    public static void main(String args[]) {  

        Screen scrn = new ColorScreen();  

        //if we can  override static , this should call method from Child class  
        scrn.show(); //IDE will show warning, static method should be called from classname  

    }  

}  

class Screen{  
    /*  
     * public static method which can not be overridden in Java  
     */  
    public static void show(){  
        System.out.printf("Static method from parent class");  
    }  
}  

class ColorScreen extends Screen{  
    /*  
     * static method of same name and method signature as existed in super  
     * class, this is not method overriding instead this is called  
     * method hiding in Java  
     */  
    public static void show(){  
        System.err.println("Overridden static method in Child Class in Java");  
    }  
}  

輸出:  
Static method from parent class

此輸出確認你無法覆蓋 Java 中的靜態方法,並且靜態方法基於類型信息而不是基於 Object 進行綁定。

如果要覆蓋靜態方法,則會調用子類或 ColorScreen 中的方法。這一切都在討論中我們可以覆蓋 Java 中的靜態方法。我們已經確認沒有,我們不能覆蓋靜態方法,我們只能在Java中隱藏靜態方法。

創建具有相同名稱和方法簽名的靜態方法稱爲Java 隱藏方法。IDE 將顯示警告:"靜態方法應該使用類名而不是使用對象來調用", 因爲靜態方法不能在 Java 中重寫。

作者:Yujiaao
https://segmentfault.com/a/1190000019962661

最近熱文:

1、Redis 到底是單線程還是多線程?

2、一週面試了 30 人,面到我心態爆炸…

3、用 float 存儲金額,老闆說損失從工資扣!

4、阿里發佈《Java開發手冊(泰山版)》

5、推薦一款 IDEA 代碼神器,再也不加班了!

6、Spring Boot Banner 換成了美女背景後…

7、圖解 Spring 循環依賴,寫得太好了!

8、99 道 Java 多線程面試題,看完我跪了!

9、程序員面試 10 大潛規則,千萬不要踩坑!

10、Struts2 爲什麼被淘汰?自己作死!

掃碼關注Java技術棧公衆號閱讀更多幹貨。

點擊「閱讀原文」帶你飛~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章