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


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

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 中重寫。

推薦去我的博客閱讀更多:

1.Java JVM、集合、多線程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、后端、架構、阿里巴巴等大廠最新面試題

覺得不錯,別忘了點贊+轉發哦!


免責聲明!

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



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