訪問(wèn)控制(或隱藏具體實(shí)現(xiàn))與 “最初的實(shí)現(xiàn)并不恰當(dāng)” 有關(guān)
如何理解:
1.不可能一次性編寫出完美的代碼 ?需要反復(fù)的修改 重構(gòu)平委,這樣才能寫出更易理解更具維護(hù)性的代碼
2.我們的代碼在被他人使用時(shí),他人希望我們的代碼永遠(yuǎn)不要改動(dòng),保持原狀最好
綜上 所有我們就需要將代碼中不變的與變的分離開來(lái) ? 使使用者不必因?yàn)閯?chuàng)造者的改動(dòng)而改變代碼
解決 約定
開發(fā)者承諾不刪除 使用者所使用的的任何方法 進(jìn)行項(xiàng)目升級(jí) ?
問(wèn)題:開發(fā)者并不知道哪些域(數(shù)據(jù)成員) 哪些 對(duì)象被 使用者所使用 ,如果對(duì)這些域,數(shù)據(jù)成員進(jìn)行刪減或者修改,并不能評(píng)估所造成的影響,如果開發(fā)者對(duì)某個(gè)方法的實(shí)現(xiàn)也并不滿意沾凄,如果想要修改或者刪除,那將造成更多問(wèn)題知允,這就造成 開發(fā)者難以迭代代碼
限制:訪問(wèn)權(quán)限修飾詞撒蟀,用來(lái)限制使用者對(duì)類的使用,將高度危險(xiǎn)的代碼隱藏起來(lái) 易于后期維護(hù)
訪問(wèn)全向依次為:public ? ?protected ? 包訪問(wèn)權(quán)限 ?private
6.1 包 ?: 庫(kù)單元
包內(nèi)包含有一組類温鸽,他們?cè)趩我坏拿挚臻g只下被組織在一起
不同包內(nèi)的類無(wú)法直接引用保屯,除非使用import進(jìn)行導(dǎo)入或者將類全名指定
java.util.ArrayList ?list = new java.util.ArrayList( ) ?//看起來(lái)是相當(dāng)?shù)姆爆?會(huì)造成代碼的臃腫
所以盡量用 import
java的導(dǎo)入機(jī)制也名字空間的管理機(jī)制,通過(guò)對(duì)命名空間進(jìn)行控制為每一個(gè)類創(chuàng)建唯一的標(biāo)識(shí)符組合可以避免類名沖突
.?java ?文件 ?被稱為編譯單位 ? 每個(gè).java文件中只允許有一個(gè)public 類 且類名與文件名一致
6.1.1 代碼組織
A.java 編譯后后生成一個(gè) A.class 文件
package 語(yǔ)句用來(lái) 標(biāo)識(shí)類所出的組(包) ?必須放在類的最上面(除注釋外)
6.1.2 創(chuàng)建獨(dú)一無(wú)二的包名
不介紹了 我直接進(jìn)入 權(quán)限修飾詞
6.2 java訪問(wèn)權(quán)限修飾詞
public ?protected ?private ? 使用:置于類中每個(gè)成員定義之前 無(wú)論是一個(gè)域還是一個(gè)方法 ? 如果不提供任何權(quán)限涤垫,就意味著是包訪問(wèn)權(quán)限
6.2.1 包訪問(wèn)權(quán)限
默認(rèn)訪問(wèn)權(quán)限 ?同一包內(nèi)的類才能夠訪問(wèn)該修飾詞的修飾的 成員或者域姑尺,其他包內(nèi)的類沒(méi)有權(quán)限訪問(wèn)
作用:將包內(nèi)所有類組織起來(lái) 讓他們可以彼此訪問(wèn)
類控制著那些代碼有權(quán)訪問(wèn)自己的成員。其他包內(nèi)的類不能直接對(duì)類中 protected private 以及默認(rèn)權(quán)限下的成員或域進(jìn)行訪問(wèn)?
訪問(wèn)的唯一途徑就是:
1.使該成員成為 public?
2.類中不添加權(quán)限修飾詞(即使用默認(rèn)權(quán)限修飾詞)蝠猬,將訪問(wèn)類放入同一包中榆芦,通過(guò)包權(quán)限來(lái)訪問(wèn)
3. 使用繼承技術(shù)匆绣,可以訪問(wèn)到類的public protected 修飾的成員 ?但不能訪問(wèn) private修飾的成員 崎淳,另外在同一包內(nèi)才能訪問(wèn) 包權(quán)限修飾成員
4.提供構(gòu)造器和變異器方法拣凹,即getter setter 方法來(lái)獲取想要訪問(wèn)的成員 ? ?get set 的必要性: 可以方便類的創(chuàng)建者任意修改?
限制權(quán)限下的成員 包括成員名 成員返回值 成員返的方式 ? 這些修改并不會(huì)被使用者所察覺(jué) 因?yàn)樗麩o(wú)需修改代碼
private ?int k ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
public int getK(){ ? ? ? 原來(lái) ? ? ?-------》修改后 ? ? ? ? ? ? ? ? ?public int getK(){ ? ? ? ? ? ? ? ?
? ? ?return k咐鹤; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return ?countK(k)祈惶; ? ? ? ? ? ? ? ? ? ? ? ? ??
} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// return ? i ; 甚至可以返回 其他變量值 ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// return ? K2 凡涩; ?可以任意修改k的標(biāo)識(shí)符
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
6.2.2 public:接口訪問(wèn)權(quán)限
使用public關(guān)鍵字活箕,意為著public之后聲明的成員可以被任何人可用 ?尤其對(duì)客戶端程序猿更是如此
6.2.3 private:你無(wú)法訪問(wèn)
關(guān)鍵字private 意味著 除了包含該成員的類外育韩,其他任何類都無(wú)法訪問(wèn)成員筋讨。
private 將自己封閉在類內(nèi) ?允許你隨意改變 而不用考慮對(duì)其他類的影響 這樣很棒對(duì)于類的創(chuàng)建者來(lái)說(shuō)很有利
最常見的單例模式 : 類的創(chuàng)建者不希望使用者 自己隨意創(chuàng)建對(duì)象 將構(gòu)建器使用private 修飾
6.2.4 protected : 繼承訪問(wèn)權(quán)限
這里需要注意的是 protected 提供包繼承權(quán)限 ?即在同一個(gè)包內(nèi)的類 可以使用 protected修飾的成員變量
繼承訪問(wèn)權(quán)限 繼承可用?
這里需要注意 A包內(nèi)的類 繼承B包中的 類悉罕,B包中 ?基類public 修飾的成員 A中子類是可以使用的壁袄,其次就是protected修飾的成員是可使用的 ?不受包權(quán)限的限制
我們來(lái)看一個(gè)結(jié)構(gòu):(基類與子類不同包...很少見 基本是要在同一個(gè)包中的)
所以我們要理解protected具有包訪問(wèn)權(quán)限 同時(shí)包訪問(wèn)權(quán)限修飾的方法 到底是正在那個(gè)包內(nèi) 當(dāng)Nigt在simpletoolbar時(shí)妨蛹,dof()是在該包內(nèi)使用 才有效蛙卤,NigtSon繼承了Nigt擁有在class內(nèi)使用該類的權(quán)利了颤难,但是由于基類不在A包中行嗤,所以NigtSon的對(duì)象如果在B包中調(diào)用 dof()是不成立的 ?
6.3 接口和實(shí)現(xiàn)
封裝:把數(shù)據(jù)和方法裝進(jìn)類中飘千,以及具體實(shí)現(xiàn)的隱藏护奈,共同被稱作是封裝哥纫。 隱藏:訪問(wèn)權(quán)限的控制常被稱為具體實(shí)現(xiàn)的隱藏
封裝的結(jié)果就是 使我們獲得了一個(gè)帶有特征和行為的數(shù)據(jù)類型(類)
訪問(wèn)權(quán)限控制 將權(quán)限控制的邊界劃在了數(shù)據(jù)類型(類)的內(nèi)部 原因在于:
1.設(shè)定 客戶端程序猿可以使用和不可使用的邊界蛀骇,不用擔(dān)心客戶端程序猿會(huì)將數(shù)據(jù)類型中的內(nèi)部實(shí)現(xiàn)當(dāng)做接口的一部分進(jìn)行調(diào)用
2.接口與具體實(shí)現(xiàn)進(jìn)行分離 ?客戶端程序猿可以向接口發(fā)送消息(調(diào)用public 修飾的成員或域)除此之外什么也不能使用简僧,那么對(duì)于創(chuàng)建端程序猿來(lái)說(shuō)雕欺,實(shí)現(xiàn)是可以進(jìn)行修改有跌代的屠列,而不會(huì)破壞客戶端程序猿的代碼
這里作者介紹了一種類創(chuàng)建方式與閱讀方式 權(quán)限遞減
先把public修飾的成員變量放在上面 之后是 protected ?默認(rèn)權(quán)限(包訪問(wèn)權(quán)限) private?
當(dāng)客戶端程序猿看到 private時(shí)即可停止閱讀或者跳躍閱讀
6.4 類的訪問(wèn)權(quán)限
java 中訪問(wèn)權(quán)限修飾詞也可用來(lái)修飾 class ? 用來(lái)控制客戶端程序猿是否可以創(chuàng)建該類的對(duì)象
不限制可以使用public 在class前進(jìn)行修飾
額外限制:
1.每個(gè)編譯單元都只能有一個(gè)public 類夏志。意味著沟蔑,每個(gè)編譯單元都有單一的公共接口瘦材,用public類來(lái)表示食棕。該接口可以按要求包含眾多的支持包訪問(wèn)權(quán)限的類簿晓。
2.public類的名稱必須與含有該編譯單元的文件名稱相匹配,包括大小寫
3.雖然不常用皿曲,但是編譯單元(.java文件)中,可以不含public 類劫樟,此時(shí)類名可以與編譯單元文件名不相符叠艳,很容易造成別人的混淆
類不能使private 或者 protected ? ?只能是public 或者 默認(rèn)權(quán)限修飾(包訪問(wèn)權(quán)限修飾)
權(quán)限修飾符可以控制對(duì)象的創(chuàng)建 但是不能控制 static public 成員的調(diào)用