對於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了。
最後,以上為個人理解,沒有找到任何官方解釋,如果錯漏,讀到這段文字的朋友自己多多求證,歡迎討論:)