Java內(nèi)部類筆記整理

前言

由于平時(shí)使用內(nèi)部類不多烂琴,所以對(duì)內(nèi)部類只有一個(gè)很淺的認(rèn)知弧械。趁著春節(jié)有空蓉媳,整理了一些內(nèi)部類的使用筆記譬挚。

使用內(nèi)部類的好處

使用內(nèi)部類可以很好地解決多重繼承的問(wèn)題,每個(gè)內(nèi)部類都能獨(dú)立地繼承一個(gè)(接口的)實(shí)現(xiàn)督怜。

內(nèi)部類的分類

成員內(nèi)部類

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

方法內(nèi)部類

匿名內(nèi)部類

1.成員內(nèi)部類

    private int num = 100;
    String name = "zhou";
    public class Inner{
        String name = "Inner Zhou";
        public void print(){
            System.out.println(Demo.this.name); //當(dāng)內(nèi)部類屬性名和外部類屬性名一樣時(shí)殴瘦,外部類需要(外部類.this.屬性)來(lái)調(diào)用
            System.out.println(name);//當(dāng)內(nèi)部類屬性名和外部類屬性名一樣時(shí),默認(rèn)調(diào)用內(nèi)部類屬性
            System.out.println(num);
        }
    }
    public static void main(String[] args){
        Demo o = new Demo();
        Inner in = o.new Inner();
        in.print();
    }
}
  • 成員內(nèi)部類可以使用任意訪問(wèn)控制符号杠,如 public 蚪腋、 protected 丰歌、 private 等。
  • 外部類可以直接訪問(wèn)成員內(nèi)部類中的數(shù)據(jù)屉凯,而不受訪問(wèn)控制符的影響立帖,如直接訪問(wèn)Demo類中的私有屬性num。
  • 當(dāng)成員內(nèi)部類的屬性名和外部類的屬性名一樣時(shí)悠砚,默認(rèn)調(diào)用成員內(nèi)部類屬性晓勇。如上面代碼中,Demo類中的name屬性與Inner中name屬性名稱一樣灌旧,那么System.out.println(name);是默認(rèn)調(diào)用的是Inner的name屬性绑咱。
  • 成員內(nèi)部類必須使用外部類對(duì)象來(lái)創(chuàng)建成員內(nèi)部類對(duì)象,而不能直接去 new 一個(gè)內(nèi)部類對(duì)象枢泰。即:內(nèi)部類 對(duì)象名 = 外部類對(duì)象.new 內(nèi)部類( )描融。
  • 上述編譯程序后,會(huì)產(chǎn)生了兩個(gè) .class 文件: Demo.class,Demo$Inner.class{}衡蚂。
  • 成員內(nèi)部類中不能存在任何static 的變量和方法,可以定義常量窿克。

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

    private int num = 100;
    String str = "zhou";
    static String name = "zhou";
    public static class Inner{
        String name = "Inner Zhou";
        public void print(){
            System.out.println(new Demo().str);
            System.out.println(Demo.name);
            System.out.println(name);
        }
    }
    public static void main(String[] args){
        Inner in = new Inner();
        in.print();
    }
}
  • 靜態(tài)內(nèi)部類不能直接訪問(wèn)外部類的非靜態(tài)成員,但可以通過(guò)【new 外部類().成員】 的方式訪問(wèn)
  • 如果外部類的靜態(tài)成員與內(nèi)部類的成員名稱相同毛甲,可通過(guò)【類名.靜態(tài)成員】訪問(wèn)外部類的靜態(tài)成+ 員年叮,否則可通過(guò)【成員名】直接調(diào)用外部類的靜態(tài)成員。
  • 創(chuàng)建靜態(tài)內(nèi)部類的對(duì)象時(shí)玻募,可以直接創(chuàng)建 內(nèi)部類 對(duì)象名 = new 內(nèi)部類();

3.方法內(nèi)部類

     String a = "zhou a";
    public void show() {
        String b = "Zhou b";
        class Inner {
            String c = "Zhou c";
            public void print(){
                System.out.println(a);
                System.out.println(b);
                System.out.println(c);
            }
        }
        Inner i = new Inner();
        i.print();
    }
    public static void main(String[] args) {
        Demo demo = new Demo();
        demo.show();
    }
}
  • 方法內(nèi)部類不能有 public只损、protected、private 以及 static 修飾符
  • jdk8版本之前补箍,只能訪問(wèn)方法中定義的 final 類型的局部變量改执。
  • jdk1.8版本之后啸蜜,新增了 Effectively final功能坑雅,方法內(nèi)部類和匿名內(nèi)部類中調(diào)用方法中的局部變量,可以不需要修飾為 final。下面是文檔的原話:

However, starting in Java SE 8, a local class can access local variables and parameters of the enclosing block that are final or effectively final. A variable or parameter whose value is never changed after it is initialized is effectively final.

  • 4.反編譯jdk8編譯之后的class文件衬横,內(nèi)部類引用外部的局部變量都是 final 修飾的裹粤。

4.匿名內(nèi)部類

    public InnerClass getInnerClass(String str){
        return new InnerClass(){
            {
                a = 2; //利用構(gòu)造代碼塊能夠達(dá)到為匿名內(nèi)部類創(chuàng)建一個(gè)構(gòu)造器的效果
            }
            public String getStr(){
                return str;
            }
        };
    }

    abstract class InnerClass {
        int a;
       abstract String getStr();
    }
    //也可以是接口
    /*interface InnerClass{
        String getStr();
    }*/
    public static void main(String[] args) {
        Demo demo = new Demo();
        InnerClass inner = demo.getInnerClass("zhou");
        System.out.println(inner.getStr());
        System.out.println(inner.a);
    }
}
  • 創(chuàng)建匿名內(nèi)部類時(shí)它會(huì)立即創(chuàng)建一個(gè)該類的實(shí)例。
  • 使用匿名內(nèi)部類時(shí)蜂林,必須繼承一個(gè)類或者實(shí)現(xiàn)一個(gè)接口遥诉,但同時(shí)也只能繼承一個(gè)類或者實(shí)現(xiàn)一個(gè)接口。
  • 匿名內(nèi)部類中不能定義構(gòu)造函數(shù)噪叙,不能存在任何的靜態(tài)成員變量和靜態(tài)方法矮锈。
  • 匿名內(nèi)部類不能是抽象的,它必須要實(shí)現(xiàn)繼承的類或者實(shí)現(xiàn)的接口的所有抽象方法睁蕾。
  • 匿名內(nèi)部類初始化:可以使用構(gòu)造代碼塊達(dá)到為匿名內(nèi)部類創(chuàng)建一個(gè)構(gòu)造器的效果苞笨。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末债朵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瀑凝,更是在濱河造成了極大的恐慌序芦,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粤咪,死亡現(xiàn)場(chǎng)離奇詭異谚中,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)寥枝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門宪塔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人囊拜,你說(shuō)我怎么就攤上這事蝌麸。” “怎么了艾疟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵来吩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蔽莱,道長(zhǎng)弟疆,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任盗冷,我火速辦了婚禮怠苔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仪糖。我一直安慰自己柑司,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布锅劝。 她就那樣靜靜地躺著攒驰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪故爵。 梳的紋絲不亂的頭發(fā)上玻粪,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音诬垂,去河邊找鬼劲室。 笑死,一個(gè)胖子當(dāng)著我的面吹牛结窘,可吹牛的內(nèi)容都是我干的很洋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼隧枫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼喉磁!你這毒婦竟也來(lái)了棺克?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤线定,失蹤者是張志新(化名)和其女友劉穎娜谊,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體斤讥,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纱皆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芭商。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片派草。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖铛楣,靈堂內(nèi)的尸體忽然破棺而出近迁,到底是詐尸還是另有隱情,我是刑警寧澤簸州,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布鉴竭,位于F島的核電站,受9級(jí)特大地震影響岸浑,放射性物質(zhì)發(fā)生泄漏搏存。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一矢洲、第九天 我趴在偏房一處隱蔽的房頂上張望璧眠。 院中可真熱鬧,春花似錦读虏、人聲如沸责静。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)灾螃。三九已至,卻和暖如春葱轩,著一層夾襖步出監(jiān)牢的瞬間睦焕,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工靴拱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人猾普。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓袜炕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親初家。 傳聞我的和親對(duì)象是個(gè)殘疾皇子偎窘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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