1. 程式人生 > >java程式設計思想-06訪問許可權控制

java程式設計思想-06訪問許可權控制

訪問控制(或隱藏具體實現)與“最初的實現並不恰當”有關。便於未來重構程式碼,而不必對業務層做過多的改變。因此,Java提供了訪問控制修飾詞,以供類庫開發人員向客戶端程式設計師指明哪些是可用的,哪些是不可用的。

訪問控制的等級,從最大許可權到最小許可權依次為:public、protected、包訪問許可權(沒有關鍵詞)、和private。

1、包:類庫單元

包內含有一組類,它們在單一的名字空間之下被組織在了一起。比如,在Java的標準釋出中有一個工具庫。它被組織在java.util名字空間之下。java.util有一個叫做ArrayList的類,使用ArrayList的一種方式是用其全名java.util.ArrayList 或者轉而使用 import關鍵字。先匯入,再使用。 我們之所以要匯入,就是要提供一個管理名字空間的機制,所以類成員的名稱都是彼此隔離的。A類中的方法f()與B類中具有相同特徵標記(引數列表)的方法f()不會彼此衝突。

當編寫一個Java原始碼檔案時,此檔案通常被稱為編譯單元(有時也被稱為轉譯單元)。每個編譯單元都必須有一個字尾名.java。而在編譯單元內則可以有一個public類,該類的名稱必須與檔案的名稱相同(包括大小寫。但不包括字尾名.java)。每個編譯單元只能有一個public類,否則編譯器就不會接受。如果在該編譯單元中還有額外的類的話,那麼在包之外的世界是無法看見這些類的,這是因為它們不是public類,而且它們主要用來為主public類提供支援。

在java中,可執行程式是一組可以打包並壓縮為一個Java文件檔案(JAR,使用Java的jar文件生成器)的.class檔案。Java直譯器負責這些檔案的查詢、裝載和解釋。

類庫實際上是一組類檔案。其中每個檔案都有一個public類,以及任意數量的非public類。因此每個檔案都有一個構件。如果希望這些構件(每一個都有他們的獨立的.java和.class檔案)從屬於同一個群組,就可以使用關鍵字package。

介紹一下Java直譯器的執行過程:首先,找出環境變數CLASSPATH。CLASSPATH包含一個或多個目錄,用作查詢.class檔案的根目錄。從根目錄開始,直譯器獲取包的名稱並將每個句點替換成反斜槓,用以CLASSPATH根中產生一個路徑名稱。得到的路徑會與CLASSPATH中的各個不同的項相連線,直譯器就在這些目錄中查詢與你所要建立的類名稱相關的.class檔案。

用import改變行為。Java沒有C的條件編譯功能,該功能可以使你不必更改任何程式程式碼,就能夠切換開關併產生不同的行為。但Java沒有此功能,因為大多C使用這個功能是為了實現跨平臺,但Java有虛擬機器,自動可以跨平臺。條件編譯還有另一個功能,那就是除錯。除錯功能在開發過程中是開啟的,而在釋出的產品中是禁止的。可以通過修改被匯入的package的方法來實現這一目的。比如建立兩個包,一個是debug一個是debugoff。它們都包含一個相同的類,該類有一個debug()方法。第一個版本顯示傳送給控制檯的String引數,第二個版本什麼都不做。以後就能通過匯入不同的類,實現不同的行為了。

2、Java訪問許可權修飾詞

1)包訪問許可權。如果不提供任何訪問許可權修飾詞,則意味著它是“包訪問許可權”。這意味著當前的包中的所有其他類對那個成員都有訪問許可權,但對這個包之外的的所有類,這個成員卻是private的。

一般來說取得某成員的訪問權的唯一途徑是:1、使該成員成為public 2、通過不加訪問許可權修飾詞並將其他類放置在同一個包內。獲得包訪問權。3、繼承。但是隻能訪問public以及protected的。4、提供訪問器(accessor)和變異器(mutator)方法(也就是set、get),以讀取和改變數值。

2)public:介面訪問許可權。使用關鍵字public,就意味著public之後緊跟著的成員宣告自己對每個人都是有用的。

預設包:

class Cake{
     public static void main (String[] args){
        Pie x = new Pie();
        x.f();  
    }      
}    
clsaa Pie{
     void f(){}   
} 

或許看起來這兩個檔案毫無關係,但是它們處在相同的目錄並且沒有給自己設定任何包名稱。這樣Java會將這樣的檔案自動看作是隸屬於該目錄的預設包之中。

3)private:你無法訪問。除了包含該成員的類之外,其他任何類都無法訪問這個成員。同處於一個包內的其他類也是不能夠訪問private成員的。如果將類的構造器都是private的,那麼它將阻礙對此類的繼承。

4)protected:繼承訪問許可權。類的建立者可以將某個特定成員,把它的訪問許可權賦予給派生類而不是所有類。protected也提供包訪問許可權。相同包內的其他類可以訪問protected元素。

3、介面和實現

訪問許可權的控制常被稱為是具體實現的隱藏。把資料和方法包裝進類中,以及具體實現的隱藏,常共同被稱為是封裝。訪問許可權控制將許可權的邊界劃在了資料型別的內部。第一個原因是要設定客戶端程式設計師可以使用和不可以使用的界限。可以在結構中建立自己的內部機制,而不必擔心客戶端程式設計師會偶然地將內部機制當作是他們可以使用的介面的一部分。第二個原因就是介面和具體實現的分離。如果結構是用於一組程式之中,而客戶端程式設計師除了可以向介面傳送資訊之外什麼也不可以做,那麼就可以隨意更改所有不是public的東西,而不會破壞客戶端的程式碼。

4、類的訪問許可權

控制類的訪問許可權。修飾詞必須出現在關鍵字class之前。類的訪問許可權只有兩個選擇,包訪問許可權或者是public。如果不希望別人訪問你的類,你可以將所有構造器都指定為private,從而阻止任何人建立該類的物件。但是沒法阻止你自己建立物件,你可以在該類的static成員內建立。