Java中的內(nèi)部類

概念

將一個(gè)類A定義在另一個(gè)類B里面代咸,里面的那個(gè)類A就稱為內(nèi)部類译荞,B則稱為外部類瞪醋。例如忿晕,身體和心臟,只能是包含的關(guān)系不可單獨(dú)分離银受。
成員內(nèi)部類+局部內(nèi)部類

1. 成員局部類

public class Body { // 外部類
    public class Heart { // 成員內(nèi)部類
        // 內(nèi)部類的方法
        public void beat() {
            System.out.println("心臟跳動:蹦蹦蹦践盼!");
            System.out.println("我叫:" + name); // 正確寫法鸦采!
        }
    }
    // 外部類的成員變量
    private String name;
    // 外部類的方法
    public void methodBody() {
        System.out.println("外部類的方法");
        new Heart().beat();
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

如何使用成員內(nèi)部類?有兩種方式:

  1. 間接方式:在外部類的方法當(dāng)中咕幻,使用內(nèi)部類渔伯;然后main只是調(diào)用外部類的方法。
  2. 直接方式肄程,公式:
    類名稱 對象名 = new 類名稱();
    【外部類名稱.內(nèi)部類名稱 對象名 = new 外部類名稱().new 內(nèi)部類名稱();】
public static void main(String[] args) {
        Body body = new Body(); // 外部類的對象
        // 通過外部類的對象锣吼,調(diào)用外部類的方法,里面間接在使用內(nèi)部類Heart
        body.methodBody();
        System.out.println("=====================");

        // 按照公式寫:
        Body.Heart heart = new Body().new Heart();
        heart.beat();
    }

注意:內(nèi)用外蓝厌,隨意訪問吐限;外用內(nèi),需要內(nèi)部類對象褂始。

// 如果出現(xiàn)了重名現(xiàn)象诸典,那么格式是:外部類名稱.this.外部類成員變量名
public class Outer {

    int num = 10; // 外部類的成員變量

    public class Inner  {

        int num = 20; // 內(nèi)部類的成員變量
        public void methodInner() {
            int num = 30; // 內(nèi)部類方法的局部變量
            System.out.println(num); // 局部變量,就近原則 30 
            System.out.println(this.num); // 內(nèi)部類的成員變量  20
            System.out.println(Outer.this.num); // 外部類的成員變量  10
        }  

    }

}

2. 局部內(nèi)部類

如果一個(gè)類是定義在一個(gè)方法內(nèi)部的崎苗,那么這就是一個(gè)局部內(nèi)部類狐粱。
“局部”:只有當(dāng)前所屬的方法才能使用它,出了這個(gè)方法外面就不能用了胆数。

class Outer {

    public void methodOuter() {
        class Inner { // 局部內(nèi)部類
            int num = 10;
            public void methodInner() {

                System.out.println(num); // 10
            }
        }

        Inner inner = new Inner();
        inner.methodInner();
    }

}

定義一個(gè)類的時(shí)候肌蜻,權(quán)限修飾符規(guī)則:

  1. 外部類:public / (default)
  2. 成員內(nèi)部類:public / protected / (default) / private
  3. 局部內(nèi)部類:什么都不能寫
/*
局部內(nèi)部類,如果希望訪問所在方法的局部變量必尼,那么這個(gè)局部變量必須是【有效final的】蒋搜。

備注:從Java 8+開始,只要局部變量事實(shí)不變判莉,那么final關(guān)鍵字可以省略豆挽。

原因:
1. new出來的對象在堆內(nèi)存當(dāng)中。
2. 局部變量是跟著方法走的券盅,在棧內(nèi)存當(dāng)中帮哈。
3. 方法運(yùn)行結(jié)束之后,立刻出棧锰镀,局部變量就會立刻消失娘侍。
4. 但是new出來的對象會在堆當(dāng)中持續(xù)存在,直到垃圾回收消失泳炉。
 */
public class MyOuter {

    public void methodOuter() {
        int num = 10; // 所在方法的局部變量

        class MyInner {
            public void methodInner() {

                System.out.println(num);
            }
        }
    }

}

匿名內(nèi)部類

  • 場景

如果接口的實(shí)現(xiàn)類(或者是子類)只需要使用唯一的一次憾筏,
那么這種情況下就可以省略掉該類的定義,不用單獨(dú)寫一個(gè)子類花鹅,而改為使用【匿名內(nèi)部類】氧腰。

  • 格式

匿名內(nèi)部類的定義格式:
接口名稱 對象名 = new 接口名稱() {
// 覆蓋重寫所有抽象方法
};

  • 描述
  1. new 代表創(chuàng)建對象的動作
  2. 接口名稱 代表匿名內(nèi)部類需要實(shí)現(xiàn)哪個(gè)接口
  3. {...} 這才是匿名內(nèi)部類的內(nèi)容
  • 注意
  1. 匿名內(nèi)部類,在【創(chuàng)建對象】的時(shí)候,類只能使用唯一一次容贝,對象也只有一個(gè)自脯。
    如果希望多次創(chuàng)建對象,而且類的內(nèi)容一樣的話斤富,那么就需要使用單獨(dú)定義的實(shí)現(xiàn)類了膏潮。
  2. 匿名對象,在【調(diào)用方法】的時(shí)候满力,方法只能調(diào)用唯一一次焕参。
    如果希望同一個(gè)對象,調(diào)用多次方法油额,那么必須給對象起個(gè)名字叠纷。
  3. 匿名內(nèi)部類是省略了【實(shí)現(xiàn)類/子類名稱】,但是匿名對象是省略了【對象名稱】
    強(qiáng)調(diào):匿名內(nèi)部類和匿名對象不是一回事A仕弧I!
public interface MyInterface {

    void method1(); // 抽象方法

    void method2();

}
public class DemoMain {

    public static void main(String[] args) {

        // 使用匿名內(nèi)部類掂僵,但不是匿名對象航厚,對象名稱就叫objA
        MyInterface objA = new MyInterface() {
            @Override
            public void method1() {
                System.out.println("匿名內(nèi)部類實(shí)現(xiàn)了方法!111-A");
            }

            @Override
            public void method2() {
                System.out.println("匿名內(nèi)部類實(shí)現(xiàn)了方法锰蓬!222-A");
            }
        };
        objA.method1();
        objA.method2();
        System.out.println("=================");

        // 使用了匿名內(nèi)部類幔睬,而且省略了對象名稱,也是匿名對象
        new MyInterface() {
            @Override
            public void method1() {
                System.out.println("匿名內(nèi)部類實(shí)現(xiàn)了方法芹扭!111-B");
            }

            @Override
            public void method2() {
                System.out.println("匿名內(nèi)部類實(shí)現(xiàn)了方法麻顶!222-B");
            }
        }.method1();
        // 因?yàn)槟涿麑ο鬅o法調(diào)用第二次方法,所以需要再創(chuàng)建一個(gè)匿名內(nèi)部類的匿名對象
        new MyInterface() {
            @Override
            public void method1() {
                System.out.println("匿名內(nèi)部類實(shí)現(xiàn)了方法舱卡!111-B");
            }

            @Override
            public void method2() {
                System.out.println("匿名內(nèi)部類實(shí)現(xiàn)了方法辅肾!222-B");
            }
        }.method2();
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市灼狰,隨后出現(xiàn)的幾起案子宛瞄,更是在濱河造成了極大的恐慌浮禾,老刑警劉巖交胚,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異盈电,居然都是意外死亡蝴簇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門匆帚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熬词,“玉大人,你說我怎么就攤上這事』ナ埃” “怎么了歪今?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長颜矿。 經(jīng)常有香客問我寄猩,道長,這世上最難降的妖魔是什么骑疆? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任田篇,我火速辦了婚禮,結(jié)果婚禮上箍铭,老公的妹妹穿的比我還像新娘泊柬。我一直安慰自己,他們只是感情好诈火,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布兽赁。 她就那樣靜靜地躺著,像睡著了一般冷守。 火紅的嫁衣襯著肌膚如雪闸氮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天教沾,我揣著相機(jī)與錄音蒲跨,去河邊找鬼。 笑死授翻,一個(gè)胖子當(dāng)著我的面吹牛或悲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播堪唐,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼巡语,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了淮菠?” 一聲冷哼從身側(cè)響起男公,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎合陵,沒想到半個(gè)月后枢赔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拥知,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年踏拜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片低剔。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡速梗,死狀恐怖肮塞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姻锁,我是刑警寧澤枕赵,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站位隶,受9級特大地震影響烁设,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钓试,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一装黑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弓熏,春花似錦恋谭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至信认,卻和暖如春材义,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嫁赏。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工其掂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人潦蝇。 一個(gè)月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓款熬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親攘乒。 傳聞我的和親對象是個(gè)殘疾皇子贤牛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348