淺談java中靜態辦法的重寫成績詳解。本站提示廣大學習愛好者:(淺談java中靜態辦法的重寫成績詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是淺談java中靜態辦法的重寫成績詳解正文
起首來看看以下法式將會打印出甚麼:
class Dog {
public static void bark() {
System.out.print("woof ");
}
}
class Basenji extends Dog {
public static void bark() { }
}
public class Bark {
public static void main(String args[]) {
Dog woofer = new Dog();
Dog nipper = new Basenji();
woofer.bark();
nipper.bark();
}
}
隨便地看一看,似乎該法式應當只打印一個woof。究竟,Basenji擴大自Dog,而且它的bark辦法界說為何也不做。main辦法挪用了bark辦法,第一次是在Dog類型的woofer上挪用,第二次是在Basenji類型的nipper上挪用。巴辛吉小鬣狗其實不會叫嚷,然則很明顯,這一只會。假如你運轉該法式,就會發明它打印的是woof woof。這只不幸的小家伙究竟出甚麼成績了?
成績在於bark是一個靜態辦法,而對靜態辦法的挪用不存在任何靜態的分配機制[JLS 15.12.4.4]。當一個法式挪用了一個靜態辦法時,要被挪用的辦法都是在編譯時辰被選定的,而這類選定是基於潤飾符的編譯期類型而做出的,潤飾符的編譯期類型就是我們給出的辦法挪用表達式中圓點右邊部門的名字。在本案中,兩個辦法挪用的潤飾符分離是變量woofer和nipper,它們都被聲明為Dog類型。由於它們具有雷同的編譯期類型,所以編譯器使得它們挪用的是雷同的辦法:Dog.bark。這也就說明了為何法式打印出woof woof。雖然nipper的運轉期類型是Basenji,然則編譯器只會斟酌其編譯器類型。
要校勘這個法式,直接從兩個bark辦法界說中移除失落static潤飾符便可。如許,Basenji中的bark辦法將覆寫而不是隱蔽Dog中的bark辦法,而該法式也將會打印出woof,而不是woof woof。經由過程覆寫,你可以取得靜態的分配;而經由過程隱蔽,你卻得不到這類特征。