嵌套類

內(nèi)部類

Java 允許我們?cè)陬惖膬?nèi)部定義一個(gè)類。如果這個(gè)類是沒有 static 修飾符鸟款,那么這樣一個(gè)嵌套在內(nèi)部的類稱為 內(nèi)部類(inner class)。

內(nèi)部類被認(rèn)為是外部對(duì)象的一個(gè)成員茂卦。在定義內(nèi)部類時(shí)何什,我們同樣有訪問(wèn)權(quán)限控制(public,private等龙,protected)处渣。

在使用內(nèi)部類時(shí),我們要先創(chuàng)建外部對(duì)象蛛砰。由于內(nèi)部類是外部對(duì)象的一個(gè)成員罐栈,我們可以在對(duì)象的內(nèi)部自由使用內(nèi)部類:

class Human
{
    private Cup myCup;
    private String name;

    public Human(String n)
    {
        this.myCup = new Cup();
        this.name  = n;
    }

    public void drinkWater(double w)
    {
        myCup.useCup(w);
        System.out.println(myCup.getWater());
    }

    // 內(nèi)部類
    private class Cup
    {
        public void useCup(double w)
        {
            this.water = this.water - w;
        }

        public double getWater()
        {
            return this.water;
        }

        private double water = 1.0;
    }
}


public class Test
{
    public static void main(String[] args)
    {
        Human me = new Human("Vamei");
        me.drinkWater(0.3);
    }
}

輸出:

0.7

上面的例子中,Cup 類為內(nèi)部類泥畅。該內(nèi)部類有 private 的訪問(wèn)權(quán)限荠诬,因此只能在 Human 內(nèi)部使用。這樣位仁,Cup 類就成為一個(gè)被 Human 類專用的類柑贞。

如果我們使用其他訪問(wèn)權(quán)限,內(nèi)部類也能從外部訪問(wèn)聂抢,比如:

class Human
{
    private Cup myCup;
    private String name;

    // 構(gòu)造器
    public Human(String n)
    {
        this.myCup = new Cup();
        this.name  = n;
    }


    public void drinkWater(double w)
    {
        myCup.useCup(w);
        System.out.println(myCup.getWater());
    }


    // 內(nèi)部類                                                        
    class Cup
    {
        public void useCup(double w)
        {
            this.water = this.water - w;
        }

        public double getWater()
        {
            return this.water;
        }

        private double water = 1.0;
    }
}


public class Test
{
    public static void main(String[] args)
    {
        Human me  = new Human("Vamei");
        me.drinkWater(0.3);

        Human.Cup soloCup = me.new Cup(); // 在外部調(diào)用內(nèi)部類
    }
}

這里钧嘶,內(nèi)部類為默認(rèn)訪問(wèn)權(quán)限(包訪問(wèn)權(quán)限)。我們可以在 Test 類中訪問(wèn) Human 的內(nèi)部類 Cup琳疏,并使用該內(nèi)部類創(chuàng)建對(duì)象有决。注意我們創(chuàng)建時(shí)如何說(shuō)明類型以及使用 new

Human.Cup soloCup = me.new Cup();

我們?cè)趧?chuàng)建內(nèi)部類對(duì)象時(shí),必須基于一個(gè)外部類對(duì)象(me)空盼,并通過(guò)該外部類對(duì)象來(lái)創(chuàng)建 Cup 對(duì)象(me.new)书幕。




閉包

我們直接創(chuàng)建內(nèi)部類對(duì)象時(shí),必須是基于一個(gè)外部類對(duì)象我注。也就是說(shuō)按咒,內(nèi)部類對(duì)象必須依附于某個(gè)外部類對(duì)象。

與此同時(shí),內(nèi)部類對(duì)象可以訪問(wèn)它所依附的外部類對(duì)象的成員(即使是 private 的成員)励七。從另一個(gè)角度來(lái)說(shuō)智袭,內(nèi)部類對(duì)象附帶有創(chuàng)建時(shí)的環(huán)境信息,也就是其他語(yǔ)言中的 閉包(closure)特性掠抬。

class Human
{
    private String name;

    public Human(String n)
    {
        this.name = n;
    }


    public void changeName(String n)
    {
        this.name = n;
    }

    
    // 內(nèi)部類
    class Cup
    {
        public String whosCup()
        {
            return name;  // 通過(guò)內(nèi)部類對(duì)象訪問(wèn)外部類對(duì)象的 name 成員
        }
    }
}


public class Test
{
    public static void main(String[] args)
    {
        Human me = new Human("Vamei");
        Human him = new Human("Jerry");

        Human.Cup myFirstCup = me.new Cup();
        Human.Cup mySecondCup = me.new Cup();
        Human.Cup hisCup = him.new Cup();

        System.out.println(myFirstCup.whosCup());
        System.out.println(mySecondCup.whosCup());
        System.out.println(hisCup.whosCup());
    }
}

輸出:

Vamei
Vamei
Jerry

在上面的例子中吼野,我們通過(guò)內(nèi)部類對(duì)象訪問(wèn)外部類對(duì)象的 name 成員。當(dāng)我們基于不同的外部對(duì)象創(chuàng)建內(nèi)部類對(duì)象時(shí)两波,所獲得的環(huán)境信息也將隨之變化瞳步。




嵌套 static 類

我們可以在類的內(nèi)部定義 static 類。這樣的類稱為 嵌套static類(nested static class)腰奋。

我們可以直接創(chuàng)建嵌套 static 類的對(duì)象单起,而不需要依附于外部類的某個(gè)對(duì)象。相應(yīng)的劣坊,嵌套 static 類也無(wú)法調(diào)用外部對(duì)象的方法嘀倒,也無(wú)法讀取或修改外部對(duì)象的數(shù)據(jù)。

從效果上看局冰,嵌套 static 類拓展了類的命名空間(name space)

class Human
{
    // 嵌套static類
    static class Chinese
    {
        public void Shout()
        {
            System.out.println("nihao");
        }
    }
}


public class Test
{
    public static void main(String[] args)
    {
        Human.Chinese him = new Human.Chinese();
        him.Shout();
    }
}

輸出:

nihao
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末测蘑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子康二,更是在濱河造成了極大的恐慌碳胳,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沫勿,死亡現(xiàn)場(chǎng)離奇詭異挨约,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)藕帜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門烫罩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人洽故,你說(shuō)我怎么就攤上這事贝攒。” “怎么了时甚?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵隘弊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我荒适,道長(zhǎng)梨熙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任刀诬,我火速辦了婚禮咽扇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己质欲,他們只是感情好树埠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嘶伟,像睡著了一般怎憋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上九昧,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天绊袋,我揣著相機(jī)與錄音,去河邊找鬼铸鹰。 笑死癌别,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的掉奄。 我是一名探鬼主播规个,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼姓建!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起缤苫,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤速兔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后活玲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涣狗,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年舒憾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了镀钓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡镀迂,死狀恐怖丁溅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情探遵,我是刑警寧澤窟赏,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站箱季,受9級(jí)特大地震影響涯穷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜藏雏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一拷况、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦赚瘦、人聲如沸粟誓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)努酸。三九已至,卻和暖如春杜恰,著一層夾襖步出監(jiān)牢的瞬間获诈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工心褐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舔涎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓逗爹,卻偏偏與公主長(zhǎng)得像亡嫌,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掘而,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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

  • 2016.7.21 嵌套類Nested Class 多數(shù)情況下把nested class分為兩種Static Ne...
    云轉(zhuǎn)水流閱讀 201評(píng)論 0 0
  • 這是一篇對(duì)Java Nested Class基礎(chǔ)知識(shí)的復(fù)習(xí)挟冠,也是掌握J(rèn)ava 8 Lambda原理的基礎(chǔ)。能力有限...
    yougang閱讀 2,109評(píng)論 0 0
  • 嵌套類有四種:靜態(tài)成員類袍睡、非靜態(tài)成員類知染、匿名類、局部類斑胜。除了第一種之外控淡,其他三種都是內(nèi)部類。(EffectiveJ...
    wangcanfeng閱讀 1,918評(píng)論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法止潘,類相關(guān)的語(yǔ)法掺炭,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法凭戴,異常的語(yǔ)法涧狮,線程的語(yǔ)...
    子非魚_t_閱讀 31,625評(píng)論 18 399
  • 你如愿以償 我迷失森海 我是該為你笑靨如花 還是應(yīng)該月下獨(dú)酌不聞不問(wèn)呢 我多想去綠林里看看 我未曾開口的 我魂?duì)繅?mèng)...
    面對(duì)接受閱讀 256評(píng)論 0 1