1. 程式人生 > >Java編程思想(六、訪問權限控制)

Java編程思想(六、訪問權限控制)

而不是 包含 得到 獲取 開發 變量 平臺 世界 類的繼承

  訪問控制(或隱藏具體實現)與“最初的實現並不恰當”有關。便於未來重構代碼,而不必對業務層做過多的改變。因此,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成員內創建。

Java編程思想(六、訪問權限控制)