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


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

  1. 為什么類和接口(不考慮內部類和接口)不能使用private和protected修飾詞,只能是public和default?
  2. 為什么接口的方法不能是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了。

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM