麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > Java > 正文

淺談java中靜態(tài)方法的重寫(xiě)問(wèn)題詳解

2019-11-26 16:03:49
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

首先來(lái)看看以下程序?qū)?huì)打印出什么:

復(fù)制代碼 代碼如下:

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();
    }
}


隨意地看一看,好像該程序應(yīng)該只打印一個(gè)woof。畢竟,Basenji擴(kuò)展自Dog,并且它的bark方法定義為什么也不做。main方法調(diào)用了bark方法,第一次是在Dog類型的woofer上調(diào)用,第二次是在Basenji類型的nipper上調(diào)用。巴辛吉小鬣狗并不會(huì)叫喚,但是很顯然,這一只會(huì)。如果你運(yùn)行該程序,就會(huì)發(fā)現(xiàn)它打印的是woof woof。這只可憐的小家伙到底出什么問(wèn)題了?

問(wèn)題在于bark是一個(gè)靜態(tài)方法,而對(duì)靜態(tài)方法的調(diào)用不存在任何動(dòng)態(tài)的分派機(jī)制[JLS 15.12.4.4]。當(dāng)一個(gè)程序調(diào)用了一個(gè)靜態(tài)方法時(shí),要被調(diào)用的方法都是在編譯時(shí)刻被選定的,而這種選定是基于修飾符的編譯期類型而做出的,修飾符的編譯期類型就是我們給出的方法調(diào)用表達(dá)式中圓點(diǎn)左邊部分的名字。在本案中,兩個(gè)方法調(diào)用的修飾符分別是變量woofer和nipper,它們都被聲明為Dog類型。因?yàn)樗鼈兙哂邢嗤木幾g期類型,所以編譯器使得它們調(diào)用的是相同的方法:Dog.bark。這也就解釋了為什么程序打印出woof woof。盡管nipper的運(yùn)行期類型是Basenji,但是編譯器只會(huì)考慮其編譯器類型。

要訂正這個(gè)程序,直接從兩個(gè)bark方法定義中移除掉static修飾符即可。這樣,Basenji中的bark方法將覆寫(xiě)而不是隱藏Dog中的bark方法,而該程序也將會(huì)打印出woof,而不是woof woof。通過(guò)覆寫(xiě),你可以獲得動(dòng)態(tài)的分派;而通過(guò)隱藏,你卻得不到這種特性。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 日韩av片网站| 精品一区二区三区中文字幕老牛 | 成人免费观看49www在线观看 | 久久网日本 | 国产一区二区不卡 | 国产小视频一区 | 免费国产网站 | 91午夜免费视频 | 制服丝袜成人动漫 | 欧美大电影免费观看 | 国产日韩三区 | 成人午夜在线观看视频 | av老司机久久 | 亚洲一区二区三区日本久久九 | japanese massage tube | 亚洲国产视频在线 | 中文字幕一区2区 | 麻豆传传媒久久久爱 | 韩国一大片a毛片 | 韩毛片| 182tv成人福利视频免费看 | 国产精品午夜一区 | 特级黄一级播放 | 久久视频精品 | 午夜视频福利 | 国产乱乱视频 | 欧美亚洲国产成人 | 欧美精品电影一区二区 | 久草热久 | 看个毛片| 日韩欧美激情视频 | 精品亚洲一区二区 | 性欧美日本 | 五月天影院,久久综合, | 亚洲精品com | 99热草| 97中文字幕第一一一页 | 国产免费人做人爱午夜视频 | 天天干天天透 | 国产精品成人一区二区三区电影毛片 | 精品一区二区三区免费 |