徹底理解Java中的訪問修飾符

一道簡單的題目

看到這個標題時可能很多朋友會嗤之以鼻,難不成簡單的訪問修飾符還有什么新花樣嗎沛膳?別急扔枫,麻煩您先看一下這個簡單的題目。


OverrideTrap.png

這無非就是一個簡單運行時多態(tài)問題锹安,眾所周知短荐,Java的多態(tài)分為編譯時多態(tài)和運行時多態(tài)兩種。其中叹哭, 編譯時多態(tài)主要指方法的重載忍宋,運行時多態(tài)指程序中定義的對象引用所指向的具體類型在運行期間才確定。 運行時多態(tài)有三個條件:

  1. 繼承

  2. 方法重寫(覆蓋)

  3. 向上轉型

main函數中风罩,base指向的實際上是Impl對象糠排,因此在調用sayHi()方法時,會執(zhí)行Impl對象的sayHi()方法而非Base對象的sayHi()方法超升,因此入宦,輸出的內容顯然是Impl:Hi。

實際上是這樣的嗎室琢?然而很不幸乾闰,輸出的卻是 Base:Hi。問題出在哪兒研乒?難道這不滿足運行時多態(tài)的條件汹忠?不應該啊淋硝,首先雹熬,Impl類繼承了Base類,其次谣膳,Impl類重寫了Base類的sayHi()方法竿报,最后,調用時進行了向上轉型继谚。三個貌似條件都滿足烈菌,但是等等,回憶一下方法重寫的要求:

  1. 子類方法的訪問權限必須大于等于父類方法;

  2. 子類方法的返回類型必須是父類方法返回類型或為父類方法返回類型的子類型芽世。

    貌似也滿足啊挚赊,我們再看一下JLS中對方法重寫的規(guī)定:

Overriding.png

翻譯過來大概為:

  1. A是C的超類

  2. C沒有繼承mA

  3. mC是mA的簽名的子簽名

  4. 下面的多個條件之一要滿足:

    mA是public的

    mA是protected的 mA在C所處的包中具有包訪問權限,且mC覆蓋了來自C的某個超類中的mA
    ...

    訪問修飾符

    看來我們忽略了方法的訪問修飾符的問題济瓢。Java中訪問修飾符規(guī)定及其訪問范圍如下表所示:

    訪問權限 當前類 同包 子類 其他包
    public
    protected ×
    default × ×
    private × × ×

    那么荠割,當子類位于當前類內部、同一包下旺矾、其他包下時訪問權限會發(fā)生什么變化呢蔑鹦?是否還遵循表格中的規(guī)定呢?對于這個問題箕宙,我們只需要記住最大訪問權限原則即可嚎朽,所謂最大訪問權限原則即子類的在不同位置時訪問權限修飾符表現(xiàn)的實際權限以最大的那個為準。依據該原則柬帕,子類在不同位置時對父類中的方法及變量的訪問權限如下表所示:

    子類中訪問權限 當前類 同包 其他包
    public
    protected
    default ×
    private × ×

    回到題目中盼产,由于子類Impl與父類Base位于同一包下催享,而Base中的sayHi()方法的修飾符為private,對子類不可見,因此不滿足方法重寫的要求叫倍,因此調用的仍然是Base中的方法,而非子類中的方法醋粟。

    這個細節(jié)看起來很不起眼蹋偏,但實際上卻包含了訪問修飾符的權限及方法重寫、多態(tài)等細節(jié)饶火,算得上是一道好題鹏控。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市肤寝,隨后出現(xiàn)的幾起案子当辐,更是在濱河造成了極大的恐慌,老刑警劉巖鲤看,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缘揪,死亡現(xiàn)場離奇詭異,居然都是意外死亡义桂,警方通過查閱死者的電腦和手機找筝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慷吊,“玉大人袖裕,你說我怎么就攤上這事「绕浚” “怎么了急鳄?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵谤民,是天一觀的道長。 經常有香客問我疾宏,道長张足,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任坎藐,我火速辦了婚禮兢榨,結果婚禮上,老公的妹妹穿的比我還像新娘顺饮。我一直安慰自己吵聪,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布兼雄。 她就那樣靜靜地躺著吟逝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赦肋。 梳的紋絲不亂的頭發(fā)上块攒,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音佃乘,去河邊找鬼囱井。 笑死,一個胖子當著我的面吹牛趣避,可吹牛的內容都是我干的庞呕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼程帕,長吁一口氣:“原來是場噩夢啊……” “哼住练!你這毒婦竟也來了?” 一聲冷哼從身側響起愁拭,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤讲逛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后岭埠,有當地人在樹林里發(fā)現(xiàn)了一具尸體盏混,經...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年惜论,在試婚紗的時候發(fā)現(xiàn)自己被綠了许赃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡来涨,死狀恐怖图焰,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情蹦掐,我是刑警寧澤技羔,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站卧抗,受9級特大地震影響藤滥,放射性物質發(fā)生泄漏。R本人自食惡果不足惜社裆,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一拙绊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泳秀,春花似錦标沪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吕嘀,卻和暖如春违寞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偶房。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工趁曼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棕洋。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓挡闰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掰盘。 傳聞我的和親對象是個殘疾皇子尿这,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容

  • 1 面向對象No6 面向對象 OO Object Oriented 編程時以對象為單元,封裝數據和邏輯庆杜,以此提...
    征程_Journey閱讀 1,141評論 0 2
  • 訪問修飾符 字段罗洗、方法都可以叫做類的成員Member,它們都需要定義訪問級別钢猛。 訪問級別的用處在于控制成員在哪些地...
    沉麟閱讀 761評論 0 0
  • 本文出自 Eddy Wiki 伙菜,轉載請注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 1,202評論 0 5
  • 我至今還記得, 童年時候命迈,有一天 我吃零食 從那吃著贩绕。 突然火的,我姐姐走過,嚇我一跳淑倾! 我只覺得一陣不知所措 啪了一...
    嗯嗯2580閱讀 183評論 0 0
  • 今天又被路人甲問到一個女孩子干嘛跑這么遠馏鹤,說大雁最終也要南飛,人最終也要落葉歸根娇哆。其實湃累,即使是流浪,有夢想有伙伴...
    小易杜閱讀 173評論 0 0