作者: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 中重寫。
推薦去我的博客閱讀更多:
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
覺得不錯,別忘了點贊+轉發哦!