你能用Java覆蓋靜態(tài)方法嗎?如果我在子類中創(chuàng)建相同的方法是編譯時(shí)錯(cuò)誤?
不,你不能在Java中覆蓋靜態(tài)方法,但在子類中聲明一個(gè)完全相同的方法不是編譯時(shí)錯(cuò)誤,這稱為隱藏在Java中的方法。
你不能覆蓋Java中的靜態(tài)方法,因?yàn)榉椒ǜ采w基于運(yùn)行時(shí)的動(dòng)態(tài)綁定,靜態(tài)方法在編譯時(shí)使用靜態(tài)綁定進(jìn)行綁定。雖然可以在子類中聲明一個(gè)具有相同名稱和方法簽名的方法,看起來可以在Java中覆蓋靜態(tài)方法,但實(shí)際上這是方法隱藏。Java不會(huì)在運(yùn)行時(shí)解析方法調(diào)用,并且根據(jù)用于調(diào)用靜態(tài)方法的 Object 類型,將調(diào)用相應(yīng)的方法。這意味著如果你使用父類的類型來調(diào)用靜態(tài)方法,那么原始靜態(tài)將從父類中調(diào)用,另一方面如果你使用子類的類型來調(diào)用靜態(tài)方法,則會(huì)調(diào)用來自子類的方法。簡(jiǎn)而言之,你無法在Java中覆蓋靜態(tài)方法。如果你使用像Eclipse或Netbeans這樣的Java IDE,它們將顯示警告靜態(tài)方法應(yīng)該使用類名而不是使用對(duì)象來調(diào)用,因?yàn)殪o態(tài)方法不能在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
此輸出確認(rèn)你無法覆蓋Java中的靜態(tài)方法,并且靜態(tài)方法基于類型信息而不是基于Object進(jìn)行綁定。如果要覆蓋靜態(tài)mehtod,則會(huì)調(diào)用子類或 ColorScreen 中的方法。這一切都在討論中我們可以覆蓋Java中的靜態(tài)方法。我們已經(jīng)確認(rèn)沒有,我們不能覆蓋靜態(tài)方法,我們只能在Java中隱藏靜態(tài)方法。創(chuàng)建具有相同名稱和mehtod簽名的靜態(tài)方法稱為Java隱藏方法。IDE將顯示警告:"靜態(tài)方法應(yīng)該使用類名而不是使用對(duì)象來調(diào)用", 因?yàn)殪o態(tài)方法不能在Java中重寫。