作者: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、后端、架構、阿里巴巴等大廠最新面試題
覺得不錯,別忘了點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/179239.html
標籤:Java
上一篇:阿里巴巴編碼規范(Java)證明
