存取權限可視範圍
到目前為止, 存取修飾子只看過public 及private. 但實際上存取修飾子有四個, private, 預設, protected, public. 下面的表格為可視範圍, 非常重要, 非背不可
修飾子 | 相同class | 子類別於 相同package |
子類別於 不同package |
Universe |
private | Yes | |||
default | Yes | Yes | ||
protected | Yes | Yes | Yes* | |
public | Yes | Yes | Yes | Yes |
預設權限
預設權限是指沒有任何權限修飾子. 口訣 : 預設權限在相同package裏如同public, 不同package如同private.
可以把不同的package想像成是不同的公司寫出來的. 比如 package A是A公司寫的SDK, package B 是B公司寫的SDK.
A公司的RD為了開發方便, 都不愛寫權限. 所以在package A裏, 這些變數及方法都是public, 可以call來call去的, 相當便利. 但當這SDK賣出去給B公司後, A package裏的東西即變成private鎖住, 讓B公司的人不能看到裏面的資訊.
因此上面的口訣可以變成 : 預設權限在相同的公司裏, 如同public, 不同的公司裏, 如同private.
protected
當SDK A賣給B公司後, B公司的RD人員總是會靠北說, 這個也鎖, 那個也鎖, 怎麼那麼難用. 這時A公司就可以把想開放給B公司RD人員的變數改為protected. 這樣一來, B公司的RD人員只要繼承SDK A的類別, 就可以在子類別更改protected的變數.
但一離開子類別, 產生物件後, 這個protected變數又變成不可存取的private, 讓後面的使用者不能隨意更改. 這種專為別家公司的RD人員所設計的權限, 叫protected, 又稱為package friendly.
記憶方法
無修飾詞:封裝(package)內有效。
private:僅類別(class)內有效。
protected:封裝(package)內及子類別(subclasses)內有效。