1.本章上來(lái)第一句就說(shuō)了什么是內(nèi)部類(lèi),一個(gè)在類(lèi)的定義放在另一個(gè)的類(lèi)內(nèi)部。
2.內(nèi)部類(lèi)擁有外部類(lèi)其外圍類(lèi)的所有元素的訪問(wèn)權(quán),包括私有的。
3.當(dāng)某個(gè)外圍類(lèi)的對(duì)象創(chuàng)建了一個(gè)內(nèi)部類(lèi)對(duì)象時(shí),吃?xún)?nèi)部類(lèi)對(duì)象必定會(huì)秘密地捕獲一個(gè)指向那外圍類(lèi)對(duì)象的引用。然后在你訪問(wèn)此外圍類(lèi)的成員時(shí),就是用那個(gè)引用來(lái)選擇外圍類(lèi)的成員的。這些編譯器豆瓣我們做好了,我們可以之前看到的是,內(nèi)部類(lèi)的對(duì)象只能在于其外圍類(lèi)的對(duì)象相關(guān)聯(lián)的情況下被創(chuàng)建(在內(nèi)部類(lèi)是非 static 時(shí))。
4.在擁有外部類(lèi)對(duì)象之前不可能創(chuàng)建內(nèi)部類(lèi)對(duì)象,因?yàn)閮?nèi)部類(lèi)對(duì)象會(huì)隱式的持有外部類(lèi)對(duì)象的引用,而其實(shí)用 static 修飾的內(nèi)部類(lèi)叫嵌套類(lèi),嵌套類(lèi)不需要對(duì)外部類(lèi)對(duì)象的引用,這個(gè)我們后面會(huì)介紹到。

5.內(nèi)部類(lèi)的作用之一是隱藏代碼實(shí)現(xiàn),此外還有就是實(shí)現(xiàn)某個(gè)接口,從而向上轉(zhuǎn)型并返回對(duì)其的引用。
6.在方法的作用域內(nèi)創(chuàng)建的類(lèi),叫做局部?jī)?nèi)部類(lèi)。

7.當(dāng)然在6的基礎(chǔ)上其實(shí)內(nèi)部類(lèi),可以放在任意的作用域內(nèi),例如:if 語(yǔ)句內(nèi)等等。
8.匿名內(nèi)部類(lèi),也就是沒(méi)有名字,作用是創(chuàng)建一個(gè)繼承自 A 的匿名類(lèi)的對(duì)象,然而如果我在匿名內(nèi)部類(lèi)創(chuàng)建的別的特性,在我向上轉(zhuǎn)型后,這些特性其實(shí)又消失掉了,因?yàn)檫@是一個(gè)沒(méi)有名字的類(lèi),所以也就無(wú)從談起它的向下轉(zhuǎn)型,而我向上轉(zhuǎn)型后也只是可以調(diào)用基類(lèi)的一些屬性,所以匿名內(nèi)部類(lèi)可以用來(lái)創(chuàng)建某個(gè)接口的實(shí)現(xiàn)類(lèi)等等。

9.匿名內(nèi)部類(lèi)不可能有構(gòu)造器,因?yàn)樗B名字都沒(méi)有。
10.如果方法中的某個(gè)變量被匿名內(nèi)部類(lèi)使用到,那么就必須要加 final 前綴,前面的參數(shù)只是傳遞到了構(gòu)造中,所以無(wú)需 final,而后面的參數(shù)被匿名內(nèi)部類(lèi)使用,所以需要使用 final 修飾,我之前一直不是特別懂為什么,之前去網(wǎng)上查過(guò),記得好像是說(shuō),方法結(jié)束后,但是我依然需要使用那么變量,正常情況下, 方法的參數(shù)隨著方法調(diào)用的技術(shù)也就消失了,所以為了可以更長(zhǎng)時(shí)間的被引用著,即方法被銷(xiāo)毀后依然可以使用(可能說(shuō)的不對(duì),還是請(qǐng)自行 Google)。

11.嵌套類(lèi),書(shū)中是這么介紹嵌套類(lèi)的,如果不需要內(nèi)部對(duì)象與其外圍類(lèi)對(duì)象之間有聯(lián)系,那么就可以將內(nèi)部類(lèi)聲明為 static,這通常稱(chēng)為嵌套類(lèi)。
12.創(chuàng)建普通的內(nèi)部類(lèi)對(duì)象會(huì)隱式的持有一個(gè)外圍類(lèi)對(duì)象的引用,而嵌套類(lèi)不是,這也意味著:
(1)要?jiǎng)?chuàng)建嵌套類(lèi)的對(duì)象,并不要其外圍類(lèi)的對(duì)象。
(2)不能從嵌套類(lèi)的對(duì)象中訪問(wèn)非靜態(tài)的外圍類(lèi)對(duì)象。
13.其實(shí)嵌套類(lèi)使用了 static 修飾,也就說(shuō)明了它其實(shí)是獨(dú)立于對(duì)象的。
14.普通的內(nèi)部類(lèi)不能有 static 數(shù)據(jù)和 static 字段,也不能有嵌套類(lèi),而嵌套類(lèi)啥都能有。
15.接口中的內(nèi)部類(lèi)為嵌套類(lèi),因?yàn)榻涌谥械念?lèi)都被自動(dòng)的變成 public 和 static 的了。
16.為什么需要內(nèi)部類(lèi)?書(shū)中給了這樣的答案:每個(gè)內(nèi)部類(lèi)都能獨(dú)立的繼承自一個(gè)(接口的)實(shí)現(xiàn),所以不論外圍類(lèi)是否已經(jīng)繼承了某個(gè)(接口的)實(shí)現(xiàn),對(duì)于內(nèi)部類(lèi)都沒(méi)有影響。所以說(shuō)實(shí)在的還是使得多重繼承的解決方案變得更完整,接口已經(jīng)解決了部分問(wèn)題,而內(nèi)部類(lèi)有效地實(shí)現(xiàn)了“多重繼承”。
17.內(nèi)部類(lèi)可以有多個(gè)實(shí)例,每個(gè)實(shí)例都有自己的狀態(tài)信息,并且與外圍類(lèi)對(duì)象的信息想獨(dú)立。
18.在單個(gè)外圍類(lèi)中,可以讓多個(gè)內(nèi)部類(lèi)以不同的方式實(shí)現(xiàn)同一個(gè)接口,或繼承同一個(gè)可類(lèi)。
19.內(nèi)部類(lèi)的繼承使用,如果只是使用 Dot 默認(rèn)的無(wú)參構(gòu)造會(huì)報(bào)錯(cuò),而必須使用 Dot 繼承的內(nèi)部類(lèi)的外圍類(lèi)的對(duì)象作為構(gòu)造參數(shù),并通過(guò) super() 調(diào)用 DotNew 的構(gòu)造,使得 DotNew 得到初始化,這樣才能使得繼承的內(nèi)部類(lèi)有外圍類(lèi)引用,因?yàn)槲覀兌贾览^承的時(shí)候我們會(huì)先去執(zhí)行父類(lèi)的構(gòu)造,而內(nèi)部類(lèi)需要一個(gè)外圍類(lèi)的引用,所以就要先初始化內(nèi)部類(lèi)的外圍類(lèi),使得內(nèi)部類(lèi)的構(gòu)造得到正常的初始化(我是這么認(rèn)為的)。

20.局部?jī)?nèi)部類(lèi)與匿名內(nèi)部類(lèi)相比,局部?jī)?nèi)部類(lèi)可以有構(gòu)造器,而構(gòu)造器就可以讓我們進(jìn)行初始化。