據(jù)說這是自學(xué)Java的一大關(guān)卡,,比較難理解,。 什么叫內(nèi)部類呢? 顧名思義,,在類的里面還有一個(gè)類。 其中在里面的那個(gè)類就是內(nèi)部類,,在外面的那個(gè)類就是外部類,。 我們知道一個(gè)類,有成員變量和成員方法,。 若是內(nèi)部類在成員變量處,,那它就是成員內(nèi)部類; 若是內(nèi)部類在成員方法內(nèi),,那它就是局部?jī)?nèi)部類,。 一、成員內(nèi)部類代碼如下: ①內(nèi)部類可以直接訪問外部類的成員變量,,包括私有成員變量,。 格式為:外部類名.this.外部類成員變量(注意是外部類類名+this)。 ②內(nèi)部類訪問本類的成員變量,。 格式為:this.內(nèi)部類成員變量,。 不管是內(nèi)部類還是外部類,其成員的訪問都是基于對(duì)象訪問的。 內(nèi)部類對(duì)象的創(chuàng)建有兩種格式: 先創(chuàng)建外部類對(duì)象,,再創(chuàng)建內(nèi)部類對(duì)象,。 注意:內(nèi)部類仍然是一個(gè)獨(dú)立的類,在編譯之后會(huì)內(nèi)部類會(huì)被編譯成獨(dú)立的.class文件,,但是前面冠以外部類的類名和$符號(hào) ,。比如:OuterClass$InterClass.class 二、局部?jī)?nèi)部類內(nèi)部類也可以定義在成員方法中,,這種情況叫局部?jī)?nèi)部類,。 內(nèi)部類只能在方法中或者某個(gè)作用域內(nèi)訪問。 其他類是無法訪問局部?jī)?nèi)部類的,。 成員內(nèi)部類,,在其他類中是可以訪問的,上面也說了兩種創(chuàng)建對(duì)象的格式,,但是在局部?jī)?nèi)部類中是不可以的,。 ①直接變量名是指內(nèi)部類局部變量; ②this.變量名是指內(nèi)部類成員變量,; ③外部類名.this.變量名是指外部類成員變量 ④訪問外部類局部變量,,其變量得是final類型,不然會(huì)報(bào)錯(cuò),。 思考有兩個(gè)問題: 1.如果外部類局部變量和內(nèi)部類局部變量重名,,如何訪問外部類局部變量? 這個(gè)問題困擾了我蠻久的,我在網(wǎng)上查詢了很久,,最終得出的結(jié)論是:如果重名,,沒法訪問外部類局部變量,因?yàn)榫徒瓌t,,外部類局部變量會(huì)被內(nèi)部類局部變量覆蓋掉,。 2.為什么外部類局部變量得是final類型? 在成員內(nèi)部類中就說過,,雖然內(nèi)部類是在外部類里面,,但是外部類和內(nèi)部類是會(huì)生成兩個(gè)class文件的,也就是說它們是各自存儲(chǔ)各自的數(shù)據(jù),。 如果不是final類型,,會(huì)出現(xiàn)外部類局部變量改變了,但是內(nèi)部類存儲(chǔ)的還是以前的那個(gè)數(shù)據(jù)的情況,。 三,、匿名內(nèi)部類除了成員內(nèi)部類、局部?jī)?nèi)部類,,還有一個(gè)匿名內(nèi)部類,。 什么叫匿名內(nèi)部類呢? 按照字面意思的理解,,就是沒有名稱的內(nèi)部類,。 現(xiàn)在有一個(gè)需求,控制臺(tái)輸出每個(gè)人在唱什么歌,。 最常規(guī)簡(jiǎn)單的方法如何做,?看如下代碼: ①創(chuàng)建一個(gè)Sing接口; ②定義一個(gè)抽象方法sing(),; ③創(chuàng)建一個(gè)類People實(shí)現(xiàn)Sing接口,; ④重寫方法Sing(); ⑤在測(cè)試類中創(chuàng)建People對(duì)象,; ⑥用對(duì)象調(diào)用方法sing(),。 打印出來結(jié)果就是:劉小愛在唱《七里香》。 那么問題來了,,如果這個(gè)對(duì)象只需要使用一次,,創(chuàng)建了一個(gè)子類People,結(jié)果只使用了一次,,這個(gè)過程又這么的繁瑣,。 有沒有更簡(jiǎn)便的方法呢? 這就需要匿名內(nèi)部類了,。代碼如下: 不需要?jiǎng)?chuàng)建一個(gè)People類,,然后實(shí)現(xiàn)接口,,最后建立對(duì)象,調(diào)用方法,。 ①匿名內(nèi)部類就相當(dāng)于,在常規(guī)方法中的People對(duì)象,,但是因?yàn)槭褂媚涿麅?nèi)部類的話不需要建立子類,,故沒有子類名,便直接用父接口命名代替,,這也是格式:new Sing(){}的由來,。 ②調(diào)用自己重寫后的方法。 匿名內(nèi)部類在父類是抽象類的時(shí)候也可以使用,,和接口時(shí)的格式是一樣的,。 總結(jié): |
|