Java-嵌套類

嵌套類分為兩類:靜態(tài)和非靜態(tài)苛聘。被聲明static的嵌套類稱為靜態(tài)嵌套類。非靜態(tài)嵌套類稱為內(nèi)部類纲菌。
內(nèi)部類有兩種特殊的內(nèi)部類: 本地類和 匿名類焕议。

為什么使用嵌套類:

  • 這是一種邏輯分組的方法宝磨,它只在一個(gè)地方使用:如果一個(gè)類只對另一個(gè)類有用,那么將它嵌入該類并將它們保持在一起是合乎邏輯的盅安。嵌套這樣的“幫助類”使得它們的包更加簡化唤锉。
  • 它增加了封裝:考慮兩個(gè)頂級(jí)類A和B,其中B需要訪問否則將被聲明的A成員private别瞭。通過在類A中隱藏類B腌紧,可以將A的成員聲明為私有,并且B可以訪問它們畜隶。另外壁肋,B本身可以被外界隱藏起來号胚。
  • 它可以導(dǎo)致更易讀和可維護(hù)的代碼:在頂級(jí)類中嵌套小類會(huì)使代碼更接近它的使用位置。

1.靜態(tài)嵌套類

與類方法和變量一樣浸遗,靜態(tài)嵌套類與其外部類相關(guān)聯(lián)猫胁。像靜態(tài)類方法一樣,靜態(tài)嵌套類不能直接引用其封閉類中定義的實(shí)例變量或方法:它只能通過對象引用來使用它們跛锌。

注意靜態(tài)嵌套類與其外部類(和其他類)的實(shí)例成員交互弃秆,就像任何其他頂級(jí)類一樣。實(shí)際上髓帽,為了方便打包菠赚,靜態(tài)嵌套類在行為上是嵌套在另一個(gè)頂級(jí)類中的頂級(jí)類。

public class OuterClass {
    
    static class StaticClass{
        public void test(){
            System.out.println("static class test");
        }
    }
    
    public static void main(String[] args) {
        OuterClass.StaticClass t = new OuterClass.StaticClass();
        t.test();
    }
}

2.內(nèi)部類

與實(shí)例方法和變量一樣郑藏,內(nèi)部類與其包含類的實(shí)例關(guān)聯(lián)衡查,并可直接訪問該對象的方法和字段。另外必盖,因?yàn)閮?nèi)部類與一個(gè)實(shí)例相關(guān)聯(lián)拌牲,所以它不能自己定義任何靜態(tài)成員。

一個(gè)實(shí)例InnerClass只能存在于一個(gè)實(shí)例中歌粥,OuterClass并且可以直接訪問其封裝實(shí)例的方法和字段塌忽。

要實(shí)例化一個(gè)內(nèi)部類,你必須首先實(shí)例化外部類失驶。然后土居,使用以下語法在外部對象內(nèi)創(chuàng)建內(nèi)部對象:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

序列化
內(nèi)部類的序列化,包括 本地和 匿名類嬉探,強(qiáng)烈不鼓勵(lì)装盯。當(dāng)Java編譯器編譯某些結(jié)構(gòu)(如內(nèi)部類)時(shí),它會(huì)創(chuàng)建合成結(jié)構(gòu) ; 這些是在源代碼中沒有相應(yīng)構(gòu)造的類甲馋,方法,字段和其他構(gòu)造迄损。合成結(jié)構(gòu)使Java編譯器能夠在不改變JVM的情況下實(shí)現(xiàn)新的Java語言功能定躏。但是,合成結(jié)構(gòu)可以在不同的Java編譯器實(shí)現(xiàn)中有所不同芹敌,這意味著.class文件也可以在不同的實(shí)現(xiàn)中有所不同痊远。因此,如果序列化內(nèi)部類氏捞,然后使用不同的JRE實(shí)現(xiàn)對其進(jìn)行反序列化碧聪,則可能會(huì)遇到兼容性問題

2.1 普通內(nèi)部類

public class OuterClass {
  public String o = "outer";
  private InnerClass inner = new InnerClass();
    
  public void test(){
    System.out.println("outer class test: "+inner.i);//inner
  }
    
  //內(nèi)部類
  class InnerClass{
    public String i = "inner";
    public void test(String i){
      System.out.println("inner class test: "+i);//test_i
      System.out.println("inner class test: "+this.i);//inner
      System.out.println("inner class test: "+o);//outer
      System.out.println("inner class test: "+OuterClass.this.o);//outer
    }
  }
    
  public static void main(String[] args) {
    OuterClass o = new OuterClass();
    o.test();
    OuterClass.InnerClass i = o.new InnerClass();
    i.test("test_i");
  }
}

2.2 本地類

本地類是在塊中定義的類,它是平衡花括號(hào)之間的一組零個(gè)或多個(gè)語句液茎。您通常會(huì)在方法的主體中找到定義的本地類逞姿。

  • 一個(gè)本地類可以訪問其封閉類的成員辞嗡。
  • 本地類可以訪問局部變量。但是滞造,本地類只能訪問聲明為最終的局部變量续室。
public class OuterClass {
    
    public String o = "outer";
    
    public void test(){
        System.out.println("outer class test");
        
        final String local = "outer local";
        
        //本地類
        class LocalInnerClass{
            public String i = "local inner";
            public void test(String i){
                System.out.println("local inner class test: "+i);//param_i
                System.out.println("local inner class test: "+this.i);//local inner
                System.out.println("local inner class test: "+o);//outer
                System.out.println("local inner class test: "+local);//outer local
                System.out.println("local inner class test: "+OuterClass.this.o);//outer
            }
        }
        LocalInnerClass li = new LocalInnerClass();
        li.test("param_i");
    }
    
    public static void main(String[] args) {
        OuterClass o = new OuterClass();
        o.test();
    }
}

2.3 匿名類

匿名類使您能夠使代碼更加簡潔。它們使您能夠同時(shí)聲明和實(shí)例化一個(gè)類谒养。除了沒有名字之外挺狰,它們就像本地的課程。如果您只需要使用一次本地課程买窟,請使用它們丰泊。

雖然本地類是類聲明,但匿名類是表達(dá)式始绍,這意味著您可以在另一個(gè)表達(dá)式中定義該類瞳购。

public class OuterClass {
    
    public String o = "outer";
    
    interface TestInterface {
        public void test();
    }
    
    public void test(){
        final String local = "outer local";
        TestInterface ti = new TestInterface() {
            public String t = "anonymous";
            @Override
            public void test() {
                System.out.println("test anonymous class: "+o);
                System.out.println("test anonymous class: "+local);
                System.out.println("test anonymous class: "+t);
            }
        };
        ti.test();
    }
    
    public static void main(String[] args) {
        OuterClass o = new OuterClass();
        o.test();
    }
}

匿名類通常用于圖形用戶界面(GUI)應(yīng)用程序。如添加事件處理疆虚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末苛败,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子径簿,更是在濱河造成了極大的恐慌罢屈,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篇亭,死亡現(xiàn)場離奇詭異缠捌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)译蒂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門曼月,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人柔昼,你說我怎么就攤上這事哑芹。” “怎么了捕透?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵聪姿,是天一觀的道長。 經(jīng)常有香客問我乙嘀,道長末购,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任虎谢,我火速辦了婚禮盟榴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘婴噩。我一直安慰自己擎场,他們只是感情好羽德,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著顶籽,像睡著了一般玩般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上礼饱,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天坏为,我揣著相機(jī)與錄音,去河邊找鬼镊绪。 笑死匀伏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蝴韭。 我是一名探鬼主播够颠,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼榄鉴!你這毒婦竟也來了履磨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤庆尘,失蹤者是張志新(化名)和其女友劉穎剃诅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驶忌,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矛辕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了付魔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聊品。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖几苍,靈堂內(nèi)的尸體忽然破棺而出翻屈,到底是詐尸還是另有隱情,我是刑警寧澤妻坝,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布伸眶,位于F島的核電站,受9級(jí)特大地震影響惠勒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜爬坑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一纠屋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盾计,春花似錦售担、人聲如沸赁遗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岩四。三九已至,卻和暖如春哥攘,著一層夾襖步出監(jiān)牢的瞬間剖煌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工逝淹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耕姊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓栅葡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子签杈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

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

  • 嵌套類有四種:靜態(tài)成員類翘狱、非靜態(tài)成員類、匿名類熊咽、局部類莫鸭。除了第一種之外,其他三種都是內(nèi)部類网棍。(EffectiveJ...
    wangcanfeng閱讀 1,915評論 0 0
  • 什么是嵌套類及內(nèi)部類滥玷? 可以在一個(gè)類的內(nèi)部定義另一個(gè)類氏身,這種類稱為嵌套類(nested classes),它有兩種...
    LittleTrue閱讀 932評論 0 1
  • 嵌套類 指定義在另一個(gè)類的內(nèi)部的類惑畴,嵌套類的存在只是為了他的外圍類蛋欣。嵌套類有四種:靜態(tài)成員類,非靜態(tài)成員類如贷,匿名類...
    人失格閱讀 570評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理陷虎,服務(wù)發(fā)現(xiàn),斷路器杠袱,智...
    卡卡羅2017閱讀 134,599評論 18 139