對於這個問題,一直沒有仔細思考
對於頂級類(外部類)來說,只有兩種修飾符:public和默認(default)。因爲外部類的上一單元是包,所以外部類只有兩個作用域:同包,任何位置。因此,只需要兩種控制權限:包控制權限和公開訪問權限,也就對應兩種控制修飾符:public和默認(default)。可以滿足所有的情況了。
如果類使用了private修飾符,說明是個內部類。內部類的上一級是外部類,那麼對應的有四種訪問控制修飾符:本類(private),同包(default),父子類(protected),任何位置(public)。當一個內部類使用了private修飾後,只能在該類的外部類內部使用。
上面這些都是平時使用司空見慣的,但是爲什麼是這種情況呢?
可以想一下,一個java項目是不可能在一個class裏面完成的。mvc模式中,是把類分爲三層,一層層調用類。如果定義爲私有的和受保護的就無法調用。換句話說,對於一個java文件,要麼就是自己單獨運行,要麼就是被其他程序作爲庫調用,如果一個java文件的類被private修飾,那麼是不是其他的程序或是類是無法使用它的,那麼他作爲一個單獨的文件就沒啥用了。如果它作爲單個文件運行,類加載怎麼找到它呢,因爲它對外不可見。同時,也失去了類的存在意義。
因此,類只有public和默認修飾符。