Java中的內(nèi)部類(lèi)

有多少人喜歡使用內(nèi)部類(lèi)漫蛔,我就問(wèn)你累不累。閑話(huà)不多說(shuō)旧蛾。
在Java中莽龟,可以將一個(gè)類(lèi)定義在另一個(gè)類(lèi)里面或者一個(gè)方法里面,這樣的類(lèi)稱(chēng)為內(nèi)部類(lèi)锨天。內(nèi)部類(lèi)分為:成員內(nèi)部類(lèi)毯盈,局部?jī)?nèi)部類(lèi),匿名內(nèi)部類(lèi)病袄,靜態(tài)內(nèi)部類(lèi)搂赋。
1.成員內(nèi)部類(lèi)。

public class A
{
    private String aa;

    class B
    {
        private String aa;


        public String getAa()
        {
            return aa;
        }


        public void setAa(String aa)
        {
            this.aa = aa;
        }


        public void print()
        {
            System.out.println(aa);
            System.out.println(A.this.aa);
        }
    }


    public String getAa()
    {
        return aa;
    }


    public void setAa(String aa)
    {
        this.aa = aa;
    }


    public static void main(String[] args)
    {
        A test = new A();
        test.aa = "hello world";
        B b = test.new B();
        b.aa = "hello java";
        b.print();
    }
}
hello java
hello world

類(lèi)B像是類(lèi)A的一個(gè)成員益缠,類(lèi)B稱(chēng)為外部類(lèi)脑奠。成員內(nèi)部類(lèi)可以無(wú)條件訪(fǎng)問(wèn)外部類(lèi)的所有成員屬性和成員方法(包括private成員和靜態(tài)成員)
不過(guò)需要注意的是,當(dāng)成員內(nèi)部類(lèi)擁有和外部類(lèi)同名的成員變量或者方法時(shí)幅慌,會(huì)發(fā)生隱藏現(xiàn)象宋欺,即默認(rèn)情況下訪(fǎng)問(wèn)的是成員內(nèi)部類(lèi)的成員。如果要訪(fǎng)問(wèn)外部類(lèi)的同名成員胰伍,需要用下面的形式訪(fǎng)問(wèn)齿诞。
外部類(lèi).this.成員變量
外部類(lèi).this.成員方法

2.局部?jī)?nèi)部類(lèi)
 局部?jī)?nèi)部類(lèi)是定義在一個(gè)方法或者一個(gè)作用域里面的類(lèi),它和成員內(nèi)部類(lèi)的區(qū)別在于局部?jī)?nèi)部類(lèi)的訪(fǎng)問(wèn)僅限于方法內(nèi)或者該作用域內(nèi)骂租。
略:貌似沒(méi)有看到別人這樣寫(xiě)過(guò)代碼

3.匿名內(nèi)部類(lèi)
匿名內(nèi)部類(lèi)是你通向大神的道路上的一座大山掌挚。因?yàn)椴皇撬腥硕寄芨愣ǖ摹_@個(gè)匿名內(nèi)部類(lèi)在異步回調(diào)機(jī)制中使用的非常多菩咨,與js的回調(diào)函數(shù)有很多相似的地方吠式。
我們知道Node.js中大部分請(qǐng)求響應(yīng)都是異步回調(diào)方式完成的,在編寫(xiě)監(jiān)聽(tīng)事件的代碼使用匿名內(nèi)部類(lèi)不但方便抽米,而且代碼比較容易維護(hù)特占。

public MQPushConsumer start() throws InterruptedException,
            MQClientException
    {
        DefaultMQPushConsumer pushConsumer = new DefaultMQPushConsumer(
                getConsumerGroup());
        pushConsumer.setNamesrvAddr(getNameSrvAddr());
        pushConsumer.subscribe(getTopic(), getSubExpression());
        pushConsumer
                .setConsumeMessageBatchMaxSize(getConsumeMessageBatchMaxSize());
        pushConsumer
                .setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        pushConsumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(
                    List<MessageExt> msgs, ConsumeConcurrentlyContext context)
            {
                try
                {
                    processMsg(msgs);
                }
                catch (Exception e)
                {
                    logger.info("end consume::" + msgs.toString());
                    logger.error(e);
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        logger.info("Consumer Started.");
        return pushConsumer;
    }

這一段代碼是RocketMQ消費(fèi)端監(jiān)聽(tīng)是否有消息過(guò)來(lái)的代碼。這里面就是用了匿名內(nèi)部類(lèi)云茸。

注意:匿名內(nèi)部?jī)?nèi)是不能有訪(fǎng)問(wèn)修飾符合static修飾符的是目。
匿名內(nèi)部類(lèi)是唯一一種沒(méi)有構(gòu)造器的類(lèi),因?yàn)闆](méi)有構(gòu)造器則使用范圍就變得很窄标捺,大部分匿名內(nèi)部類(lèi)都用于接口回調(diào)(所謂的回調(diào)就是把內(nèi)部類(lèi)比作一個(gè)電話(huà)號(hào)碼懊纳,這個(gè)電話(huà)號(hào)碼是你給別人的揉抵,只有別人能夠打,你自己不能用自己的手機(jī)打嗤疯,其他的號(hào)碼你還是可以打的)冤今。匿名內(nèi)部類(lèi)在編譯的時(shí)候由系統(tǒng)自動(dòng)起名為Outter$1.class。一般來(lái)說(shuō)茂缚,匿名內(nèi)部類(lèi)用于繼承其他類(lèi)或是實(shí)現(xiàn)接口戏罢,并不需要增加額外的方法,只是對(duì)繼承方法的實(shí)現(xiàn)或是重寫(xiě)脚囊。

4.靜態(tài)內(nèi)部類(lèi)
靜態(tài)內(nèi)部類(lèi)也是定義在另一個(gè)類(lèi)里面的類(lèi)龟糕,只不過(guò)在類(lèi)的前面多了一個(gè)關(guān)鍵字static。靜態(tài)內(nèi)部類(lèi)是不需要依賴(lài)于外部類(lèi)的悔耘,這點(diǎn)和類(lèi)的靜態(tài)成員屬性有點(diǎn)類(lèi)似讲岁,并且它不能使用外部類(lèi)的非static成員變量或者方法,這點(diǎn)很好理解衬以,因?yàn)樵跊](méi)有外部類(lèi)的對(duì)象的情況下催首,可以創(chuàng)建靜態(tài)內(nèi)部類(lèi)的對(duì)象,如果允許訪(fǎng)問(wèn)外部類(lèi)的非static成員就會(huì)產(chǎn)生矛盾泄鹏,因?yàn)橥獠款?lèi)的非static成員必須依附于具體的對(duì)象

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末郎任,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子备籽,更是在濱河造成了極大的恐慌舶治,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件车猬,死亡現(xiàn)場(chǎng)離奇詭異霉猛,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)珠闰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)惜浅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人伏嗜,你說(shuō)我怎么就攤上這事坛悉。” “怎么了承绸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵裸影,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我军熏,道長(zhǎng)轩猩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮均践,結(jié)果婚禮上晤锹,老公的妹妹穿的比我還像新娘。我一直安慰自己彤委,他們只是感情好鞭铆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著葫慎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪薇宠。 梳的紋絲不亂的頭發(fā)上偷办,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音澄港,去河邊找鬼椒涯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛回梧,可吹牛的內(nèi)容都是我干的废岂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼狱意,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼湖苞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起详囤,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤财骨,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后藏姐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體隆箩,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年羔杨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捌臊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兜材,死狀恐怖理澎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情曙寡,我是刑警寧澤矾端,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站卵皂,受9級(jí)特大地震影響秩铆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一殴玛、第九天 我趴在偏房一處隱蔽的房頂上張望捅膘。 院中可真熱鬧,春花似錦滚粟、人聲如沸寻仗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)署尤。三九已至,卻和暖如春亚侠,著一層夾襖步出監(jiān)牢的瞬間曹体,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工硝烂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留箕别,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓滞谢,卻偏偏與公主長(zhǎng)得像串稀,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子狮杨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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

  • #內(nèi)部類(lèi)的定義 Java中允許在類(lèi)中定義另一個(gè)類(lèi)母截,這個(gè)定義在其他類(lèi)內(nèi)部的類(lèi)就是內(nèi)部類(lèi)(嵌套類(lèi)),包含內(nèi)部類(lèi)的類(lèi)也被...
    Enigmaaaaa閱讀 542評(píng)論 0 0
  • Java 內(nèi)部類(lèi) 分四種:成員內(nèi)部類(lèi)橄教、局部?jī)?nèi)部類(lèi)微酬、靜態(tài)內(nèi)部類(lèi)和匿名內(nèi)部類(lèi)。 1颤陶、成員內(nèi)部類(lèi): 即作為外部類(lèi)的一個(gè)成...
    ikaroskun閱讀 1,223評(píng)論 0 13
  • Java中的內(nèi)部類(lèi)共分為四種: 靜態(tài)內(nèi)部類(lèi)static inner class (also called nest...
    WebberCao閱讀 425評(píng)論 0 1
  • 來(lái)自: Nerxious - 博客園鏈接:http://www.cnblogs.com/nerxious/arch...
    rill_閱讀 180評(píng)論 0 0
  • 概念: 內(nèi)部類(lèi)( Inner Class )就是定義在另外一個(gè)類(lèi)里面的類(lèi)颗管。與之對(duì)應(yīng),包含內(nèi)部類(lèi)的類(lèi)被稱(chēng)為外部類(lèi)滓走。 ...
    by小杰閱讀 218評(píng)論 0 0