對於java程式設計師來說,java的訪問許可權修飾詞public、protected、default、private的區別和使用肯定都不是問題,這裡也不再囉嗦了,反正度娘一搜就一大把。最近在整理java core的培訓資料時,想到了幾個關於許可權修飾詞的問題:
- 為什麼類和介面(不考慮內部類和介面)不能使用private和protected修飾詞,只能是public和default?
- 為什麼介面的方法不能是private和protected,只能public(default可以寫出來,但是編譯之後自動轉為了public)?
仔細想了一下,原因也不難。主要是雖然做了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了。
最後,以上為個人理解,沒有找到任何官方解釋,如果錯漏,讀到這段文字的朋友自己多多求證,歡迎討論:)