程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 為什麼類和接口不能使用private和protected?接口的方法不能使用private、protected、default,privateprotected

為什麼類和接口不能使用private和protected?接口的方法不能使用private、protected、default,privateprotected

編輯:JAVA綜合教程

為什麼類和接口不能使用private和protected?接口的方法不能使用private、protected、default,privateprotected


對於java程序員來說,java的訪問權限修飾詞public、protected、default、private的區別和使用肯定都不是問題,這裡也不再啰嗦了,反正度娘一搜就一大把。最近在整理java core的培訓資料時,想到了幾個關於權限修飾詞的問題:

仔細想了一下,原因也不難。主要是雖然做了java不短的時間,這個問題還真沒認真想過,實在慚愧。記下自己的想法,要多思考,不要成了框架的搬運工。 

第一個問題: 

private:

  很好理解,類和接口如果定義成private,那麼其他任何類都不能訪問,這樣的類寫出來也沒有意義。

protected:

  這個問題用反證法比較好解釋清楚,假設類B和A不在同一個包,A又是protected類, 那麼B能訪問A的前提是B是A的子類,而B能成為A的子類(或者說B能繼承A)的前提又是B能訪問A。這兩個條件互為前提,無法實現。

 

第二個問題:

private:

  接口是需要其他類實現的, 如果方法定義成private,那麼其他任何類都不能訪問。這樣的方法即要求被實現,又對任何類不可見,這是無法實現的。

protected:

  (1)假設public接口I有一個protected方法M,那麼位於其他包的public類C就可以實現這個接口(方法M依然是protected)。那麼C的同包類D調用方法M只能這樣訪問:

C c = new C();
c.M();

  無法這樣訪問:

I c = new C();
c.M();

  這樣就失去了使用接口的重要意義:提供統一的接口,面向接口編程思想也無法體現。

  (2)假設接口I是default的, 那麼方法M是protected理論上是沒有問題的,而且M也可以是default、public。至於為什麼不讓用protected,可能是出於簡化修飾詞的復雜度的目的(如果使用,需要區分接口是public的時候不能用,default接口則能用),至於default請參考(3).

default:

  (3)假設public接口I有一個default方法M, 那麼位於其他包的無法正常實現接口I,因為方法M對其不可見。

  (4)假設default接口I有一個default方法M,那麼方法M是default理論上是沒有問題的,而且M也可以是proteced、public。可能出於和(2)所說不能用protected的相同原因,不能使用default。

  因此,綜合以上四點,接口方法只能使用public,既然只能用public,java編譯器在你忘了在M前寫public的時候干脆自動幫你轉成public了。

 

最後,以上為個人理解,沒有找到任何官方解釋,如果錯漏,讀到這段文字的朋友自己多多求證,歡迎討論:)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved