內(nèi)部類和靜態(tài)嵌套類

內(nèi)部類(Inner Class)和靜態(tài)內(nèi)部類(Static Nested Class)的區(qū)別:
定義在一個類內(nèi)部的類叫內(nèi)部類若河,包含內(nèi)部類的類稱為外部類。內(nèi)部類可以聲明public撰洗、protected捞挥、private等訪問限制希柿,可以聲明 為abstract的供其他內(nèi)部類或外部類繼承與擴展诊沪,或者聲明為static、final的曾撤,也可以實現(xiàn)特定的接口端姚。外部類按常規(guī)的類訪問方式使用內(nèi)部 類,唯一的差別是外部類可以訪問內(nèi)部類的所有方法與屬性挤悉,包括私有方法與屬性渐裸。

內(nèi)部類可以是靜態(tài)static的,也可用public装悲,default昏鹃,protected和private修飾,

外部類的修飾符只能是public衅斩,abstract盆顾,final

(1)創(chuàng)建實例

   OutClass.InnerClass obj = outClassInstance.new InnerClass(); //注意是外部類實例.new怠褐,內(nèi)部類

   AAA.StaticInner in = new AAA.StaticInner();//注意是外部類本身畏梆,靜態(tài)內(nèi)部類

(2)內(nèi)部類中的this

內(nèi)部類中的this與其他類一樣是指的本身。創(chuàng)建內(nèi)部類對象時奈懒,它會與創(chuàng)造它的外圍對象有了某種聯(lián)系奠涌,于是能訪問外圍類的所有成員,不需任何特殊條件磷杏,可理 解為內(nèi)部類鏈接到外部類溜畅。 用外部類創(chuàng)建內(nèi)部類對象時,此內(nèi)部類對象會秘密的捕獲一個指向外部類的引用极祸,于是慈格,可以通過這個引用來訪問外圍類的成員怠晴。

(3)外部類訪問內(nèi)部類

內(nèi)部類類似外部類的屬性,因此訪問內(nèi)部類對象時總是需要一個創(chuàng)建好的外部類對象浴捆。內(nèi)部類對象通過‘外部類名.this.xxx’的形式訪問外部類的屬性與方法蒜田。如:

       System.out.println("Print in inner Outer.index=" + pouter.this.index);
       System.out.println("Print in inner Inner.index=" + this.index);

(4)內(nèi)部類向上轉(zhuǎn)型

內(nèi)部類也可以和普通類一樣擁有向上轉(zhuǎn)型的特性。將內(nèi)部類向上轉(zhuǎn)型為基類型选泻,尤其是接口時冲粤,內(nèi)部類就有了用武之地。如果內(nèi)部類是private的页眯,只可以被它的外部類問梯捕,從而完全隱藏實現(xiàn)的細節(jié)。

(5)方法內(nèi)的類

方法內(nèi)創(chuàng)建的類(注意方法中也能定義類)窝撵,不能加訪問修飾符傀顾。另外,方法內(nèi)部的類也不是在調(diào)用方法時才會創(chuàng)建的忿族,它們一樣也被事先編譯了锣笨。

6)靜態(tài)內(nèi)部類

定義靜態(tài)內(nèi)部類:在定義內(nèi)部類的時候,可以在其前面加上一個權限修飾符static道批。此時這個內(nèi)部類就變?yōu)榱遂o態(tài)內(nèi)部類错英。

通常稱為嵌套類,當內(nèi)部類是static時隆豹,意味著:

[1]要創(chuàng)建嵌套類的對象椭岩,并不需要其外圍類的對象;

[2]不能從嵌套類的對象中訪問非靜態(tài)的外圍類對象(不能夠從靜態(tài)內(nèi)部類的對象中訪問外部類的非靜態(tài)成員)璃赡;

嵌 套類與普通的內(nèi)部類還有一個區(qū)別:普通內(nèi)部類的字段與方法判哥,只能放在類的外部層次上,所以普通的內(nèi)部類不能有static數(shù)據(jù)和static字段碉考, 也不能包含嵌套類塌计。但是在嵌套類里可以包含所有這些東西。也就是說侯谁,在非靜態(tài)內(nèi)部類中不可以聲明靜態(tài)成員锌仅,只有將某個內(nèi)部類修飾為靜態(tài)類,然后才能夠在這 個類中定義靜態(tài)的成員變量與成員方法墙贱。

另外热芹,在創(chuàng)建靜態(tài)內(nèi)部類時不需要將靜態(tài)內(nèi)部類的實例綁定在外部類的實例上。普通非靜態(tài)內(nèi)部類的 對象是依附在外部類對象之中的惨撇,要在一個外部類中定義一個靜態(tài)的內(nèi)部類伊脓,不需要利用關鍵字new來創(chuàng)建內(nèi)部類的實例。靜態(tài)類和方法只屬于類本身魁衙,并不屬于 該類的對象报腔,更不屬于其他外部類的對象株搔。

(7)內(nèi)部類標識符

每個類會產(chǎn)生一個.class文件,文件名即為類名纯蛾。同樣邪狞,內(nèi)部類也會產(chǎn)生這么一個.class文件,但是它的名稱卻不是內(nèi)部類的類名茅撞,而是有著嚴格的限制:外圍類的名字帆卓,加上$,再加上內(nèi)部類名字。

(8)為何要用內(nèi)部類米丘?

  1. 內(nèi)部類一般只為其外部類使用剑令;

  2. 內(nèi)部類提供了某種進入外部類的窗戶;

  3. 也是最吸引人的原因拄查,每個內(nèi)部類都能獨立地繼承一個接口吁津,而無論外部類是否已經(jīng)繼承了某個接口。因此堕扶,內(nèi)部類使多重繼承的解決方案變得更加完整碍脏。

package com.test.xml;
public class OutClassTest {
    static int a;

    int b;

    public static void test() {
        System.out.println("outer class static function");
    }

    public static void main(String[] args) {
        OutClassTest oc = new OutClassTest();
        // new一個外部類
        OutClassTest oc1 = new OutClassTest();
        // 通過外部類的對象new一個非靜態(tài)的內(nèi)部類
        OutClassTest.InnerClass no_static_inner = oc1.new InnerClass();
        // 調(diào)用非靜態(tài)內(nèi)部類的方法
        System.out.println(no_static_inner.getKey());

        // 調(diào)用靜態(tài)內(nèi)部類的靜態(tài)變量
        System.out.println(OutClassTest.InnerStaticClass.static_value);
        // 不依賴于外部類實例,直接實例化內(nèi)部靜態(tài)類
        OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();
        // 調(diào)用靜態(tài)內(nèi)部類的非靜態(tài)方法
        System.out.println(inner.getValue());
        // 調(diào)用內(nèi)部靜態(tài)類的靜態(tài)方法
        System.out.println(OutClassTest.InnerStaticClass.getMessage());
    }

    private class InnerClass {
        // 只有在靜態(tài)內(nèi)部類中才能夠聲明或定義靜態(tài)成員
        // private static String tt = "0";
        private int flag = 0;

        public InnerClass() {
            // 三.非靜態(tài)內(nèi)部類的非靜態(tài)成員可以訪問外部類的非靜態(tài)變量和靜態(tài)變量
            System.out.println("InnerClass create a:" + a);
            System.out.println("InnerClass create b:" + b);
            System.out.println("InnerClass create flag:" + flag);
            //
            System.out.println("InnerClass call outer static function");
            // 調(diào)用外部類的靜態(tài)方法
            test();
        }

        public  String getKey() {
            return "no-static-inner";
        }
    }

    private static class InnerStaticClass {
        // 靜態(tài)內(nèi)部類可以有靜態(tài)成員,而非靜態(tài)內(nèi)部類則不能有靜態(tài)成員稍算。
        private static String static_value = "0";

        private int flag = 0;

        public InnerStaticClass() {
            System.out.println("InnerClass create a:" + a);
            // 靜態(tài)內(nèi)部類不能夠訪問外部類的非靜態(tài)成員
            // System.out.println("InnerClass create b:" + b);
            System.out.println("InnerStaticClass flag is " + flag);
            System.out.println("InnerStaticClass tt is " + static_value);
        }

        public int getValue() {
            // 靜態(tài)內(nèi)部類訪問外部類的靜態(tài)方法
            test();
            return 1;
        }

        public static String getMessage() {
            return "static-inner";
        }
    }

    public OutClassTest() {
        // new一個非靜態(tài)的內(nèi)部類
        InnerClass ic = new InnerClass();
        System.out.println("OuterClass create");
    }

}

/**

  • 總結:
  • 1.靜態(tài)內(nèi)部類可以有靜態(tài)成員(方法典尾,屬性),而非靜態(tài)內(nèi)部類則不能有靜態(tài)成員(方法糊探,屬性)钾埂。
  • 2.靜態(tài)內(nèi)部類只能夠訪問外部類的靜態(tài)成員,而非靜態(tài)內(nèi)部類則可以訪問外部類的所有成員(方法,屬性)科平。
  • 3.實例化一個非靜態(tài)的內(nèi)部類的方法:
  • a.先生成一個外部類對象實例
  • OutClassTest oc1 = new OutClassTest();
  • b.通過外部類的對象實例生成內(nèi)部類對象
  • OutClassTest.InnerClass no_static_inner = oc1.new InnerClass();
  • 4.實例化一個靜態(tài)內(nèi)部類的方法:
  • a.不依賴于外部類的實例,直接實例化內(nèi)部類對象
  • OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();
  • b.調(diào)用內(nèi)部靜態(tài)類的方法或靜態(tài)變量,通過類名直接調(diào)用
  • OutClassTest.InnerStaticClass.static_value
  • OutClassTest.InnerStaticClass.getMessage()
    */
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末褥紫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瞪慧,更是在濱河造成了極大的恐慌髓考,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弃酌,死亡現(xiàn)場離奇詭異氨菇,居然都是意外死亡,警方通過查閱死者的電腦和手機矢腻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門门驾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來射赛,“玉大人多柑,你說我怎么就攤上這事¢乖穑” “怎么了竣灌?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵聂沙,是天一觀的道長。 經(jīng)常有香客問我初嘹,道長及汉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任屯烦,我火速辦了婚禮坷随,結果婚禮上,老公的妹妹穿的比我還像新娘驻龟。我一直安慰自己温眉,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布翁狐。 她就那樣靜靜地躺著类溢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪露懒。 梳的紋絲不亂的頭發(fā)上闯冷,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音懈词,去河邊找鬼蛇耀。 笑死,一個胖子當著我的面吹牛坎弯,可吹牛的內(nèi)容都是我干的蒂窒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼荞怒,長吁一口氣:“原來是場噩夢啊……” “哼洒琢!你這毒婦竟也來了?” 一聲冷哼從身側響起褐桌,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤衰抑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后荧嵌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呛踊,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年啦撮,在試婚紗的時候發(fā)現(xiàn)自己被綠了谭网。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡赃春,死狀恐怖愉择,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤锥涕,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布衷戈,位于F島的核電站,受9級特大地震影響层坠,放射性物質(zhì)發(fā)生泄漏殖妇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一破花、第九天 我趴在偏房一處隱蔽的房頂上張望谦趣。 院中可真熱鬧,春花似錦座每、人聲如沸蔚润。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嫡纠。三九已至,卻和暖如春延赌,著一層夾襖步出監(jiān)牢的瞬間除盏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工挫以, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留者蠕,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓掐松,卻偏偏與公主長得像踱侣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子大磺,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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

  • Java 內(nèi)部類 分四種:成員內(nèi)部類抡句、局部內(nèi)部類、靜態(tài)內(nèi)部類和匿名內(nèi)部類杠愧。 1待榔、成員內(nèi)部類: 即作為外部類的一個成...
    ikaroskun閱讀 1,231評論 0 13
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法流济,內(nèi)部類的語法锐锣,繼承相關的語法,異常的語法绳瘟,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 抽象類 在繼承的層次結構中分瘦,每個新子類都使類變得越來越明確具體。如果從一個子類追溯到父類畅卓,類就會變得更通用和抽象。...
    Steven1997閱讀 1,376評論 0 5
  • 甘德禮( 咨詢師角色限制)持續(xù)原創(chuàng)分享第68天 SFBT不像是傳統(tǒng)的咨詢蟋恬,他只是一位輔佐者翁潘,而不是當事人本人。咨詢...
    華南帝虎閱讀 367評論 2 0
  • 人肉搬運自知乎:你都用 Python 來做什么歼争? - Jeffersli的回答
    WESTWALL閱讀 126評論 0 0