国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

淺談java中靜態方法的重寫問題詳解

2019-11-26 16:03:49
字體:
來源:轉載
供稿:網友

首先來看看以下程序將會打印出什么:

復制代碼 代碼如下:

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。通過覆寫,你可以獲得動態的分派;而通過隱藏,你卻得不到這種特性。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 佛学| 德令哈市| 汨罗市| 通山县| 乌拉特中旗| 绥中县| 桃园市| 霍城县| 望江县| 通山县| 四子王旗| 武强县| 图片| 佛山市| 庐江县| 沧州市| 墨玉县| 桂阳县| 汉源县| 台前县| 抚宁县| 剑川县| 永和县| 绥化市| 商丘市| 鄂州市| 天门市| 湖口县| 巨野县| 蓝山县| 东乌珠穆沁旗| 长汀县| 华亭县| 晴隆县| 海口市| 宕昌县| 长乐市| 香格里拉县| 盱眙县| 宿州市| 东乌珠穆沁旗|