Java編程思想--第6章 訪問權(quán)限控制

6.1 包:庫單元

控制對成員的訪問權(quán)限有兩個原因:

第一兆沙,為了使用戶不要碰觸那些他們不該碰觸的部分泥彤,這些部分對于類內(nèi)部的操作時必要的锯厢,但是他并不屬于客戶端程序員所需接口的一部分福扬。因此,將方法和域指定稱private梭姓,對客戶端程序員而言是一種服務(wù)。

第二嫩码,為了讓類庫設(shè)計者可以更改類的內(nèi)部工作方式,而不必擔(dān)心這樣會對客戶端程序員產(chǎn)生重大的影響罪既。

訪問權(quán)限控制專注于類庫創(chuàng)建者和該類庫的外部使用者之間的關(guān)系铸题,這種關(guān)系是一種通信方式。

訪問控制(或隱藏具體實現(xiàn))與"最初的實現(xiàn)并不恰當"有關(guān)琢感。換句話說就是:“我們的代碼幾乎不可能在一開始就做到最好丢间,后期的迭代可以逐步改善情況,訪問控制很大情況下就是為了后續(xù)代碼的改善”驹针。訪問權(quán)限控制的等級烘挫,從最大權(quán)限到最小權(quán)限依次為:public、protected柬甥、包訪問權(quán)限和private

import導(dǎo)入包饮六。一般都是import java.util.*;

每一個Java文件只能有一個public類。

6.1.1 代碼組織

當編譯一個.java文件的時候苛蒲,在.java文件中的每個類都會有一個輸出文件卤橄,而該輸出文件的名稱和.java文件中的每個類相同,多了個后綴名.class臂外。

Java可運行程序是一組可以打包并壓縮為一個Java文檔文件jar的.class文件窟扑。Java解釋器負責(zé)這些文件的查找、裝載和解釋漏健。

類庫實際上是一組類文件嚎货。其中每個文件都有一個public類,以及任意數(shù)量的非public類蔫浆。包的名稱對應(yīng)目錄路徑殖属。

package語句必須是文件中的第一行非注釋程序代碼。在一個項目中克懊,不可以有相同的兩個包名忱辅,也就是說,包名不能和項目中其他的包名重復(fù)谭溉,這里不但包括自定義包名也包括項目所引用的類庫的包名墙懂。

6.2 Java訪問權(quán)限修飾詞

對于一個類,其成員(包括成員變量和成員方法)能否被其他類所訪問扮念,取決于該成員的修飾詞损搬。在Java中,類成員的訪問權(quán)限修飾詞有四個:private,無(包訪問權(quán)限)巧勤,protected 和 public嵌灰。

所有事物都具備訪問權(quán)限控制,如果沒寫就是包訪問控制權(quán)限颅悉。這種默認的訪問權(quán)限沒有關(guān)鍵字沽瞭,有些時候表示為friendly。這就意味著當前的包中的所有其他類對那個成員都有訪問權(quán)限剩瓶,但對于這個包之外的所有類驹溃,這個成員是private的。

取得對某成員的訪問權(quán)限的唯一途徑:

使該成員成為public延曙;

通過不加訪問權(quán)限修飾符并將其他類放置于同一個包內(nèi)的方式給成員賦予包訪問控制權(quán)限豌鹤;

繼承而來的類可以訪問public和protected類,private類不行枝缔,只有兩個類處于同一個包時才能訪問默認權(quán)限的布疙;

提供訪問器和變異器,get和set方法愿卸。

特別地灵临,如果你不希望其他任何人對該類擁有訪問權(quán),你可以把所有的構(gòu)造器都指定為private的擦酌,從而阻止任何人創(chuàng)建該類的對象俱诸。這個時候,該類的對象就只能在其static成員內(nèi)部進行創(chuàng)建赊舶,這種情形有點像單例模式睁搭,例如像下面的例子那樣:

class Test {

? ? ? // private Constructor!

? ? ? private Test() {}

? ? ? // Allow creation via static method:

? ? ? public static Test getTest() {

? ? ? ? ? return new Test();

? ? ? }

? ? }

在上面所提到的四種修飾詞中,除 protected 外都很好理解和掌握笼平,在此略作簡述:

public :被public修飾的類成員能被所有的類直接訪問园骆;

private:被private修飾的類成員只能在定義它的類中被訪問,其他類都訪問不到寓调。特別地锌唾,我們一般建議將成員變量設(shè)為private的,并為外界提供 getter/setter 去對成員變量進行訪問夺英,這種做法充分體現(xiàn)了Java的封裝思想晌涕;

包訪問權(quán)限:包訪問權(quán)限就是Java中的默認的權(quán)限,具有包訪問權(quán)限的類成員只能被同一包中的類訪問痛悯。

protected關(guān)鍵字

===========================================================

被protected修飾的成員對于本包和其子類可見余黎。

實際上,protected的可見性在于兩點:

基類的protected成員是包內(nèi)可見的载萌,并且對子類可見惧财;

若子類與基類不在同一包中巡扇,那么在子類中,子類實例可以訪問其從基類繼承而來的protected方法垮衷,而不能訪問基類實例的protected方法厅翔。

在碰到涉及protected成員的調(diào)用時,首先要確定出該protected成員來自何方搀突,其可見性范圍是什么刀闷,然后就可以判斷出當前用法是否可行了仰迁。

===========================================================

//示例一package p1;

public class Father1 {

? ? protected void f() {}? ? // 父類Father1中的protected方法}package p1;

public class Son1 extends Father1 {}package p11;

public class Son11 extends Father1{}package p1;

public class Test1 {

? ? public static void main(String[] args) {

? ? ? ? Son1 son1 = new Son1();

? ? ? ? son1.f(); // Compile OK? ? ----(1)? ? ? ? son1.clone(); // Compile Error? ? ----(2)? ? ? ? Son11 son = new Son11();? ?

? ? ? ? son11.f(); // Compile OK? ? ----(3)? ? ? ? son11.clone(); // Compile Error? ? ----(4)? ? }

}

對于上面的示例涩赢,首先看(1)(3),其中的f()方法從類Father1繼承而來轩勘,其可見性是包p1及其子類Son1和Son11,而由于調(diào)用f()方法的類Test1所在的包也是p1怯邪,因此(1)(3)處編譯通過绊寻。其次看(2)(4),其中的clone()方法的可見性是java.lang包及其所有子類悬秉,對于語句“son1.clone();”和“son11.clone();”澄步,二者的clone()在類Son1、Son11中是可見的和泌,但對Test1是不可見的村缸,因此(1)(3)處編譯不通過。

===========================================================

//示例二package p2;class MyObject2 {

? ? protected Object clone() throws CloneNotSupportedException{

? ? ? return super.clone();

? ? }

}package p22;

public class Test2 extends MyObject2 {

? ? public static void main(String args[]) {

? ? ? MyObject2 obj = new MyObject2();

? ? ? obj.clone(); // Compile Error? ? ? ? ----(1)? ? ? Test2 tobj = new Test2();

? ? ? tobj.clone(); // Complie OK? ? ? ? ----(2)? ? }

}

對于(1)而言武氓,clone()方法來自于類MyObject2本身梯皿,因此其可見性為包p2及MyObject2的子類,雖然Test2是MyObject2的子類县恕,但在Test2中不能訪問基類MyObject2的protected方法clone()东羹,因此編譯不通過;對于(2)而言,由于在Test2中訪問的是其本身實例的從基類MyObject2繼承來的的clone()忠烛,因此編譯通過属提。

===========================================================

//示例三package p3;class MyObject3 extends Test3 {

}package p33;

public class Test3 {

? public static void main(String args[]) {

? ? MyObject3 obj = new MyObject3();

? ? obj.clone();? // Compile OK? ? ------(1)? }

}

對于(1)而言,clone()方法來自于類Test3美尸,因此其可見性為包p33及其子類MyObject3冤议,而(1)正是在p33的類Test3中調(diào)用,屬于同一包师坎,編譯通過恕酸。

===========================================================

//示例四package p4;class MyObject4 extends Test4 {

? protected Object clone() throws CloneNotSupportedException {

? ? return super.clone();

? }

}package p44;

public class Test4 {

? public static void main(String args[]) {

? ? MyObject4 obj = new MyObject4();

? ? obj.clone(); // Compile Error? ? ? -----(1)? }

}對于(1)而言,clone()方法來自于類MyObject4屹耐,因此其可見性為包p4及其子類(此處沒有子類)尸疆,而類Test4卻在包p44中椿猎,因此不滿足可見性,編譯不通過寿弱。

==========================================================//示例五package p5;class MyObject5 {

? ? protected Object clone() throws CloneNotSupportedException{

? ? ? return super.clone();

? ? }

}

public class Test5 {

? ? public static void main(String[] args) throws CloneNotSupportedException {

? ? ? MyObject5 obj = new MyObject5();

? ? ? obj.clone(); // Compile OK? ? ? ? ----(1)? ? }

}對于(1)而言犯眠,clone()方法來自于類MyObject5,因此其可見性為包p5及其子類(此處沒有子類)症革,而類Test5也在包p5中筐咧,因此滿足可見性,編譯通過噪矛。

===========================================================//示例六package p6;class MyObject6 extends Test6{}

public class Test6 {

? public static void main(String[] args) {

? ? MyObject6 obj = new MyObject6();

? ? obj.clone();? ? ? ? // Compile OK? -------(1)? }

}對于(1)而言量蕊,clone()方法來自于類Test6,因此其可見性為包p6及其子類MyObject6艇挨,而類Test6也在包p6中残炮,因此滿足可見性,編譯通過缩滨。

===========================================================//示例七package p7;class MyObject7 extends Test7 {

? ? public static void main(String[] args) {

? ? ? ? Test7 test = new Test7();

? ? ? ? test.clone(); // Compile Error? ----- (1)? }

}

public class Test7 {

}對于(1)而言势就,clone()方法來自于類Object,因此該clone()方法可見性為包java.lang及其子類Test7脉漏,由于類MyObject7不在此范圍內(nèi)苞冯,因此不滿足可見性,編譯不通過侧巨。

6.3 接口與實現(xiàn)

訪問權(quán)限的控制常被稱為是具體實現(xiàn)的隱藏舅锄。把數(shù)據(jù)和方法包裝進類中,具體實現(xiàn)的隱藏司忱,常共同被稱作是封裝皇忿。其結(jié)果是一個同時帶有特征和行為的數(shù)據(jù)類型。

6.4 類的訪問權(quán)限

每個編譯單元(文件)都只能有一個public類烘贴,特殊情況下可以沒有禁添。

public類的名稱必須完全與含有該編譯單元的文件名一模一樣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桨踪,一起剝皮案震驚了整個濱河市老翘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锻离,老刑警劉巖铺峭,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異汽纠,居然都是意外死亡卫键,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門虱朵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莉炉,“玉大人钓账,你說我怎么就攤上這事⌒跄” “怎么了梆暮?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長绍昂。 經(jīng)常有香客問我啦粹,道長,這世上最難降的妖魔是什么窘游? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任唠椭,我火速辦了婚禮,結(jié)果婚禮上忍饰,老公的妹妹穿的比我還像新娘贪嫂。我一直安慰自己,他們只是感情好艾蓝,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布撩荣。 她就那樣靜靜地躺著,像睡著了一般饶深。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逛拱,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天敌厘,我揣著相機與錄音,去河邊找鬼朽合。 笑死俱两,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的曹步。 我是一名探鬼主播宪彩,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼讲婚!你這毒婦竟也來了尿孔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤筹麸,失蹤者是張志新(化名)和其女友劉穎活合,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體物赶,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡白指,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了酵紫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片告嘲。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡错维,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出橄唬,到底是詐尸還是另有隱情赋焕,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布轧坎,位于F島的核電站宏邮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏缸血。R本人自食惡果不足惜蜜氨,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捎泻。 院中可真熱鬧飒炎,春花似錦、人聲如沸笆豁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闯狱。三九已至煞赢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哄孤,已是汗流浹背照筑。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瘦陈,地道東北人凝危。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像晨逝,于是被迫代替她去往敵國和親蛾默。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法捉貌,類相關(guān)的語法支鸡,內(nèi)部類的語法,繼承相關(guān)的語法趁窃,異常的語法苍匆,線程的語...
    子非魚_t_閱讀 31,623評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)棚菊,斷路器浸踩,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • Class and Interfaces CLASSES and interfaces lie at the he...
    LaMole閱讀 886評論 0 1
  • 今天有兩個新聞比較火。 一個是八達嶺野生動物園老虎襲人事件统求。 一個是洪水來襲小伙舍妻先去救媽妻子離家出走事件检碗。 朋...
    孤月淘客筆記閱讀 300評論 0 0
  • 作為財務(wù)人員据块,未分配利潤這個會計分錄怎么用啊折剃?什么情況下用另假?是應(yīng)該知道的,今天怕犁,就這個科目總結(jié)一下边篮。 ...
    肖瑞艷閱讀 429評論 0 2