訪問權(quán)限控制
訪問控制(或隱藏具體實(shí)現(xiàn))與“最初的實(shí)現(xiàn)并不恰當(dāng)”有關(guān)。
重構(gòu)即重寫代碼,以使得它更可讀,更易理解,并因此而更具可維護(hù)性。
訪問權(quán)限控制的等級(jí),從大到小是:public,protected,包訪問權(quán)限(沒有關(guān)鍵詞)和private。
java用關(guān)鍵字package將構(gòu)建捆綁到一個(gè)內(nèi)聚的類庫單元中。
一、包:庫單元
包內(nèi)包含一組類,他們在單一的名字空間下被組織在一起。
import java.util.* 導(dǎo)入類使用的 “*”,就是提供一個(gè)管理名字空間的機(jī)制,所有類成員的名稱都是彼此隔離的。
由于名字之間的潛在沖突,在java中對名稱空間進(jìn)行完全控制并為每個(gè)類創(chuàng)建唯一的標(biāo)識(shí)符組合就成為了非常重要的事情。
未命名的包,被稱為默認(rèn)包,java包命名的規(guī)則是全部使用小寫字母。java源代碼文件通常被稱為編譯單元,每個(gè)編譯單元都必須有一個(gè)后綴名 .java 該java文件中的每個(gè)類都會(huì)有一個(gè)輸出文件,該輸出文件名稱與 .java文件中每個(gè)類的名稱相同,只是多了一個(gè)后綴名 .class。
java可運(yùn)行程序是一組可以打包并壓縮為一個(gè)java文檔文件(JAR,使用java的jar文檔生成器)的.class文件。java解釋器負(fù)責(zé)這些文件的查找,裝載和解釋。
package關(guān)鍵字歸納屬于同一個(gè)群組的 java文件,它必須在java文件中除注釋外的第一句程序代碼。
package名稱的第一部分是類的創(chuàng)建者的反順序的Internet域名,域名是獨(dú)一無二的,因此你的包名也是獨(dú)一無二的。
java運(yùn)行解釋器運(yùn)行過程如下:首先,找出環(huán)境變量CLASSPATH,CLASSPATH包含一個(gè)或多個(gè)目錄,用作查找.class文件的根目錄。從根目錄開始,解釋器獲取包的名稱并將每個(gè)句點(diǎn)替換成反斜杠,以從CLASSPATH根中產(chǎn)生一個(gè)路徑名稱(package foo.bar.baz變成foo\bar\baz或者foo/bar/baz),得到的路徑會(huì)與CLASSPATH中的各個(gè)不同的項(xiàng)相連接,解釋器就在這些目錄中查找與你所要?jiǎng)?chuàng)建的類名稱相關(guān)的.class文件。
二、java訪問權(quán)限修飾詞
public,protected,包訪問權(quán)限(沒有關(guān)鍵詞)和private。每個(gè)訪問權(quán)限修飾詞筋控制它所修飾的特定定義的訪問權(quán)
1,包訪問權(quán)限
默認(rèn)訪問權(quán)限沒有任何關(guān)鍵字,但通常是指包訪問權(quán)限(有時(shí)也表示成為friendly)。這意味著當(dāng)前的包中的所有其他類對那個(gè)成員都有訪問權(quán)限,但對于這個(gè)包之外的所有類,這個(gè)成員是private。由于一個(gè)編譯單元(即一個(gè)文件),只能錄屬于一個(gè)包,所以經(jīng)由包訪問權(quán)限,處于同一個(gè)編譯單元中的所有類彼此之間都是自動(dòng)可訪問的。
2,pubilc:接口訪問權(quán)限
使用關(guān)鍵字public,就意味著public之后緊跟著的成員生命自己對每個(gè)人都是可用的,尤其是使用類庫的客戶程序員更是如此。
3,private:你無法訪問
關(guān)鍵字private意思是除了包含該成員的類之外,其他任何類都無法訪問這個(gè)成員。
4,protected繼承訪問權(quán)限
關(guān)鍵字protected處理的是繼承的概念,通過繼承可以利用一個(gè)現(xiàn)有類-我們稱其為基類,然后將新成員添加到該現(xiàn)有類中而不必碰該現(xiàn)有類。還可以改變該類的現(xiàn)有成員行為。
三、接口和實(shí)現(xiàn)
訪問權(quán)限的控制常被稱為是具體實(shí)現(xiàn)的隱藏,把數(shù)據(jù)和方法包裝進(jìn)類中,以及具體實(shí)現(xiàn)的隱藏,常共同被稱為是封裝。其結(jié)果是一個(gè)同時(shí)帶有特征和行為的數(shù)據(jù)類型。
出于兩個(gè)很重要的原因,訪問權(quán)限控制將權(quán)限的邊界劃在了數(shù)據(jù)類型的內(nèi)部。1,要設(shè)定客戶端程序員可以使用和不可以使用的界限。2,將接口和具體實(shí)現(xiàn)進(jìn)行分離。
四、類的訪問權(quán)限
在java中,訪問權(quán)限修飾詞也可以用于確定庫中哪些類對于該庫的使用者是可用的。
每個(gè)編譯單元都只能有一個(gè)public類。public類的名稱必須完全與含有該編程單元的文件名相匹配,包括大小寫。編譯單元內(nèi)完全不帶public類也是可能的。
注意:類既不可以是private的也不可以說protected。所以對于類的訪問權(quán)限,僅有兩個(gè)選擇:包訪問權(quán)限或public。
五、總結(jié)
無論是在什么樣的關(guān)系中,設(shè)立一些為各成員所遵守的界限始終是很重要的。
本章討論了類是如何被構(gòu)建成類庫的:首先,介紹了一組類是如何被打包到一個(gè)類庫中的,其次,類是如何控制對其成員的訪問的。