Java之成員訪問控制
-
前言
在介紹訪問控制之前,首先需要了解的是成員訪問指的是什麼。成員訪問是指的以下兩種操作:
- 一個類中的方法程式碼是否能夠訪問(呼叫)另一個類中的成員
- 一個類是否能夠繼承其父類的成員
本文將會介紹四種成員訪問許可權
-
公共型別:public
公共型別使用public關鍵字修飾,當一個成員被修飾為public時,所有其他類,無論該類屬於那個包,均能夠訪問該成員,例:
test.java中:
package chapter03; public class Test { public void method() { System.out.println("呼叫的方法為public型別"); } }
如上述例子中,Sample3_26中的main方法呼叫了包chapter03中的Test中的method方法。這是因為method方法被宣告為public。
對於繼承而言,規則為,如果父類的成員宣告為public,那麼無論這兩個類是否在同一個包中,該子類都能繼承其父類的成員。
-
私有型別:private
這裡將介紹成員被標識為私有型別後的含義與用法,並且在最後將介紹面向物件中的封裝及其優點。標識為私有型別的成員用 private關鍵字修飾,其不能被該成員所在類之外的任何類中的程式碼訪問。例如對程式碼Test稍做修改,改為 Private Test類,而程式碼 Sample3-26不變:
編譯上述兩個原始碼檔案,並執行類 Sample3-26,編譯器報錯,如上圖所示。
從圖可以看出,方法 method卻不能被呼叫。因為其被設為pivate型別,對該成員自己類之外的任何程式碼來說都是不可見的對於繼承而言,規則為如果父類的成員宣告為 private,子類在任何情況下都不能繼承該成員。
-
預設型別(defaault)
當一個成員前面沒有寫任何訪問限制修飾符時,其訪問許可權為預設型別。具有此訪問許可權的許可權,只對同一個包中的類是可見的,也就是說,在同一個包中,預設型別相當於public,而對包外相當於private。
只需將兩個類放到同一個包中,或將預設型別改為public型別,就可以解決問題。
-
保護型別:protected
標識為保護型別的成員用protected關鍵字修飾,其規則幾乎與預設型別幾乎一樣,當訪問該成員的類位於同一包內,則該型別的訪問許可權相當於public型別。只是有一點點區別,如訪問該成員的類位於包外,則只有通過繼承才能訪問該成員。下表列出了修飾符及其可見性:
可見性 | public | protected | default | private |
對同一個類 | 是 | 是 | 是 | 是 |
對同一個包中的任何類 | 是 | 是 | 是 | 否 |
對包外所有非子類 | 是 | 否 | 否 | 否 |
對同一個包中的子類基於繼承訪問 | 是 | 是 | 是 | 否 |
對包外的子類基於繼承訪問 | 是 | 是 | 否 | 否 |
訪問修飾符不能用來修飾區域性變數,否則會導致編譯錯誤,而且區域性變數的作用域為區域性,也沒有必要。