java權(quán)限控制

淺析Java中的訪問權(quán)限控制

今天我們來一起了解一下Java語言中的訪問權(quán)限控制苔严。在討論訪問權(quán)限控制之前,先來討論一下為何需要訪問權(quán)限控制葵袭×祝考慮兩個場景:

場景1:工程師A編寫了一個類ClassA个初,但是工程師A并不希望ClassA被該應(yīng)用中其他所用的類都訪問到,那么該如何處理猴蹂?

場景2:如果工程師A編寫了一個類ClassA院溺,其中有兩個方法fun1、fun2磅轻,工程師只想讓fun1對外可見珍逸,也就是說,如果別的工程師來調(diào)用ClassA聋溜,只可以調(diào)用方法fun1谆膳,那么該怎么處理?

此時勤婚,訪問權(quán)限控制便可以起到作用了摹量。
  在Java中涤伐,提供了四種訪問權(quán)限控制:默認訪問權(quán)限(包訪問權(quán)限)馒胆,public,private以及protected凝果。
  注意祝迂,上述四種訪問權(quán)限,只有默認訪問權(quán)限和public能夠用來修飾類器净。修飾類的變量和方法四種權(quán)限都可以型雳。(本處所說的類針對的是外部類,不包括內(nèi)部類)
  下面就分別針對修飾類和修飾類的成員來講述這四種訪問權(quán)限控制。
1.修飾類
  默認訪問權(quán)限(包訪問權(quán)限):用來修飾類的話纠俭,表示該類只對同一個包中的其他類可見沿量。
  public:用來修飾類的話,表示該類對其他所有的類都可見冤荆。
  下面通過幾個例子來看一下兩者的區(qū)別:
例1:

Main.java:

package com.cxh.test1;
public class Main {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
         
        People people = new People("Tom");
        System.out.println(people.getName());
    }
 
}

People.java

package com.cxh.test1;
 
class People {           //默認訪問權(quán)限(包訪問權(quán)限)
 
    private String name = null;
     
    public People(String name) {
        this.name = name;
    }
     
    public String getName() {
        return name;
    }
     
    public void setName(String name) {
        this.name = name;
    }
}

從代碼可以看出朴则,修飾People類采用的是默認訪問權(quán)限,而由于People類和Main類在同一個包中钓简,因此People類對于Main類是可見的乌妒。

例子2:

People.java

package com.cxh.test2;
 
class People {           //默認訪問權(quán)限(包訪問權(quán)限)
 
    private String name = null;
     
    public People(String name) {
        this.name = name;
    }
     
    public String getName() {
        return name;
    }
     
    public void setName(String name) {
        this.name = name;
    }
}

此時People類和Main類不在同一個包中,會發(fā)生什么情況呢外邓?

下面是Main類中的提示的錯誤:


提示Peolple類在Main類中不可視撤蚊。從這里就可以看出,如果用默認訪問權(quán)限去修飾一個類损话,該類只對同一個包中的其他類可見侦啸,對于不同包中的類是不可見的。

正如上圖的快速修正提示所示席镀,將People類的默認訪問權(quán)限更改為public的話匹中,People類對于Main類便可見了。

2.修飾類的方法和變量

默認訪問權(quán)限(包訪問權(quán)限):如果一個類的方法或變量被包訪問權(quán)限修飾豪诲,也就意味著只能在同一個包中的其他類中顯示地調(diào)用該類的方法或者變量顶捷,在不同包中的類中不能顯示地調(diào)用該類的方法或變量。

private:如果一個類的方法或者變量被private修飾屎篱,那么這個類的方法或者變量只能在該類本身中被訪問服赎,在類外以及其他類中都不能顯示地進行訪問。

protected:如果一個類的方法或者變量被protected修飾交播,對于同一個包的類重虑,這個類的方法或變量是可以被訪問的。對于不同包的類秦士,只有繼承于該類的類才可以訪問到該類的方法或者變量缺厉。

public:被public修飾的方法或者變量,在任何地方都是可見的隧土。

下面再通過幾個例子來看一下它們作用域類的方法和變量時的區(qū)別:

例3:

Main.java沒有變化

People.java

package com.cxh.test1;
 
public class People {      
 
    private String name = null;
     
    public People(String name) {
        this.name = name;
    }
     
    String getName() {    //默認訪問權(quán)限(包訪問權(quán)限)
        return name;
    }
     
    void setName(String name) {   //默認訪問權(quán)限(包訪問權(quán)限)
        this.name = name;
    }
}

此時在Main類是可以顯示調(diào)用方法getName和setName的提针。

但是如果People類和Main類不在同一個包中:

package com.cxh.test2;    //與Main類處于不同包中
 
public class People {      
 
    private String name = null;
     
    public People(String name) {
        this.name = name;
    }
     
    String getName() {    //默認訪問權(quán)限(包訪問權(quán)限)
        return name;
    }
     
    void setName(String name) {   //默認訪問權(quán)限(包訪問權(quán)限)
        this.name = name;
    }
}

此時在Main類中會提示錯誤:

由此可以看出,如果用默認訪問權(quán)限來修飾類的方法或者變量曹傀,則只能在同一個包的其他類中進行訪問辐脖。

例4:

People.java

package com.cxh.test1;   
 
public class People {      
 
    private String name = null;
     
    public People(String name) {
        this.name = name;
    }
     
    protected String getName() {   
        return name;
    }
     
    protected void setName(String name) {  
        this.name = name;
    }
}

此時是可以在Main中顯示調(diào)用方法getName和setName的。

如果People類和Main類處于不同包中:

package com.cxh.test2;   
 
public class People {      
 
    private String name = null;
     
    public People(String name) {
        this.name = name;
    }
     
    protected String getName() {   
        return name;
    }
     
    protected void setName(String name) {  
        this.name = name;
    }
}

則會在Main中報錯:


如果在com.cxh.test1中定一個類Man繼承People皆愉,則可以在類Man中顯示調(diào)用方法getName和setName:

package com.cxh.test1;
 
import com.cxh.test2.People;
 
public class Man extends People{
 
    public Man(String name){
        super(name);
    }
     
    public String toString() {
        return getName();
    }
}

下面補充一些關(guān)于Java包和類文件的知識:

1)Java中的包主要是為了防止類文件命名沖突以及方便進行代碼組織和管理嗜价;

2)對于一個Java源代碼文件艇抠,如果存在public類的話,只能有一個public類久锥,且此時源代碼文件的名稱必須和public類的名稱完全相同家淤,另外,如果還存在其他類瑟由,這些類在包外是不可見的媒鼓。如果源代碼文件沒有public類,則源代碼文件的名稱可以隨意命名错妖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绿鸣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子暂氯,更是在濱河造成了極大的恐慌潮模,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痴施,死亡現(xiàn)場離奇詭異擎厢,居然都是意外死亡,警方通過查閱死者的電腦和手機辣吃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門动遭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人神得,你說我怎么就攤上這事厘惦。” “怎么了哩簿?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵宵蕉,是天一觀的道長。 經(jīng)常有香客問我节榜,道長羡玛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任宗苍,我火速辦了婚禮稼稿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘讳窟。我一直安慰自己让歼,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布挪钓。 她就那樣靜靜地躺著是越,像睡著了一般耳舅。 火紅的嫁衣襯著肌膚如雪碌上。 梳的紋絲不亂的頭發(fā)上倚评,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音馏予,去河邊找鬼天梧。 笑死,一個胖子當著我的面吹牛霞丧,可吹牛的內(nèi)容都是我干的呢岗。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼蛹尝,長吁一口氣:“原來是場噩夢啊……” “哼后豫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起突那,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤挫酿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后愕难,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體早龟,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年猫缭,在試婚紗的時候發(fā)現(xiàn)自己被綠了葱弟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡猜丹,死狀恐怖芝加,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情射窒,我是刑警寧澤妖混,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站轮洋,受9級特大地震影響制市,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弊予,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一祥楣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧汉柒,春花似錦误褪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至正塌,卻和暖如春嘀略,著一層夾襖步出監(jiān)牢的瞬間恤溶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工帜羊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留咒程,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓讼育,卻偏偏與公主長得像帐姻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子奶段,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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