第六章 訪問(wèn)權(quán)限控制

訪問(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 類 且類名與文件名一致

這是不行的 但是把 public去掉就沒(méi)問(wèn)題了

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è)包中的)

方法在哪個(gè)包中被包訪問(wèn)權(quán)限限制,對(duì)象就只能在那個(gè)包內(nèi)調(diào)用它变泄,其他包調(diào)用會(huì)報(bào)錯(cuò)

所以我們要理解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)用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末潦俺,一起剝皮案震驚了整個(gè)濱河市事示,隨后出現(xiàn)的幾起案子肖爵,更是在濱河造成了極大的恐慌劝堪,老刑警劉巖秒啦,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荐糜,死亡現(xiàn)場(chǎng)離奇詭異暴氏,居然都是意外死亡答渔,警方通過(guò)查閱死者的電腦和手機(jī)宋雏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蚪燕,“玉大人馆纳,你說(shuō)我怎么就攤上這事鲁驶。” “怎么了寿羞?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵虱岂,是天一觀的道長(zhǎng)第岖。 經(jīng)常有香客問(wèn)我蔑滓,道長(zhǎng)燎窘,這世上最難降的妖魔是什么褐健? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮坐梯,結(jié)果婚禮上烛缔,老公的妹妹穿的比我還像新娘院喜。我一直安慰自己喷舀,他們只是感情好爸邢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布浇辜。 她就那樣靜靜地躺著柳洋,像睡著了一般卑雁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弛房,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死膝迎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼叹誉!你這毒婦竟也來(lái)了鸯两?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤长豁,失蹤者是張志新(化名)和其女友劉穎钧唐,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匠襟,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钝侠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酸舍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帅韧。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖啃勉,靈堂內(nèi)的尸體忽然破棺而出忽舟,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布叮阅,位于F島的核電站刁品,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏浩姥。R本人自食惡果不足惜挑随,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勒叠。 院中可真熱鬧兜挨,春花似錦、人聲如沸眯分。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弊决。三九已至担猛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丢氢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工先改, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疚察,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓仇奶,卻偏偏與公主長(zhǎng)得像貌嫡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子该溯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容