






































內(nèi)部類是一種非常有用的機(jī)制,它允許你把一些邏輯相關(guān)的類組織在一起,并控制位于內(nèi)部類的可視性(進(jìn)入修飾符和其它普通類元素沒有區(qū)別)。同時(shí)內(nèi)部類能夠與外部類通信。利用內(nèi)部類的特性可以使得寫出的代碼優(yōu)雅而清雅。
1)內(nèi)部類可以在內(nèi)部進(jìn)行使用,更典型的情況是在外部類設(shè)置一個(gè)方法返回一個(gè)指向內(nèi)部類的引用
2)如果想從外部類的非靜態(tài)方法之外的任意位置創(chuàng)建某個(gè)內(nèi)部類的對(duì)象(這個(gè)內(nèi)部類必須是public),必須具體指明這個(gè)對(duì)象的類型:OuterClassName.InnerClassName;在new表達(dá)式中提供對(duì)其它外部類對(duì)象的引用,需要使用.new語法。






這個(gè)例子也告訴我們,必須使用外部類的對(duì)象來創(chuàng)建內(nèi)部類對(duì)象,不能直接創(chuàng)建內(nèi)部類對(duì)象,因?yàn)樗鼈冎氨仨毥⒁粋€(gè)聯(lián)系(當(dāng)然除了嵌套類--靜態(tài)內(nèi)部類)
3)內(nèi)部類和制造它的外圍對(duì)象之間有一種聯(lián)系(對(duì)象創(chuàng)建一個(gè)內(nèi)部類對(duì)象時(shí),內(nèi)部類對(duì)象會(huì)捕獲一個(gè)指向那個(gè)外圍類對(duì)象的引用),這種聯(lián)系使得它能訪問外圍對(duì)象的所有成員,而不要任何特殊條件。此外,內(nèi)部類還擁有其外圍類的所有元素的訪問權(quán)。(是不是可以把內(nèi)部類看成外部類的一個(gè)元素,一個(gè)“特殊”的“類元素”)
如果需要生成對(duì)外部類對(duì)象的引用,可以使用外部類的名字后面緊跟圓點(diǎn)和this“.this”:


















4) 當(dāng)將內(nèi)部類向上轉(zhuǎn)型為其基類,尤其是轉(zhuǎn)型為一個(gè)接口的時(shí)候,內(nèi)部類就有了用武之地。這是因?yàn)閮?nèi)部類--某個(gè)接口的實(shí)現(xiàn)--能夠完全不可見,并且不可用(將內(nèi)部類進(jìn)入修飾符設(shè)置為private或protected就可以了)。所得到的只是指向基類或接口的引用,所以能夠很方便地隱藏實(shí)現(xiàn)細(xì)節(jié),也完全阻止任何依賴于類型的編碼










































































5) 同樣的我們可以在任意一個(gè)方法中或作用域內(nèi)創(chuàng)建一個(gè)內(nèi)部類,除了要注意它(內(nèi)部類)的使用作用域外,其它用法和在類的內(nèi)部類用法無異。
6)匿名內(nèi)部類:沒有名字的,不能有構(gòu)造器的類


























































7)要?jiǎng)?chuàng)建嵌套類(靜態(tài)內(nèi)部類)意味著:并不需要其外圍類的對(duì)象;不能從嵌套類的對(duì)象中訪問非靜態(tài)的外圍類對(duì)象。嵌套類與普通內(nèi)部類還有一個(gè)區(qū)別:普通內(nèi)部類的字段與方法只能放在類的外部層次上,所以普通的內(nèi)部類不能有static數(shù)據(jù)和static字段,也不能包含嵌套類。但是嵌套類可以包含所有這些東西。
8)一個(gè)內(nèi)部類被嵌套多少層并不重要,它能透明地訪問所有它所嵌入的外圍類的所有成員
9)“每個(gè)內(nèi)部類都能獨(dú)立地繼承自一個(gè)(接口的)實(shí)現(xiàn),所以無論外圍類是否已經(jīng)繼承了某個(gè)(接口的)實(shí)現(xiàn),對(duì)于內(nèi)部類都沒有影響”,這樣的內(nèi)部類特性使得其很多解決“多重繼承”:
a. 內(nèi)部類可以有多個(gè)實(shí)例,每個(gè)實(shí)例都有自己的狀態(tài)信息,并且與其外圍類對(duì)象的信息相互獨(dú)立(通過匿名內(nèi)部類實(shí)現(xiàn))
b. 在單個(gè)外圍類中,可以讓多個(gè)內(nèi)部類以不同的方式實(shí)現(xiàn)同一個(gè)接口,或繼承同一個(gè)類(通過匿名內(nèi)部類實(shí)現(xiàn))
c. 創(chuàng)建內(nèi)部類對(duì)象的時(shí)候并不依賴于外圍類對(duì)象的創(chuàng)建,并沒有令人迷惑的“is-a”關(guān)系,它就是一個(gè)獨(dú)立的實(shí)體










































































































10)如果創(chuàng)建一個(gè)繼承具有內(nèi)部類的外圍類的新類,并在新類中試圖覆蓋內(nèi)部類,會(huì)發(fā)生什么呢?
當(dāng)繼承了某個(gè)外圍類的時(shí)候,內(nèi)部類并沒有發(fā)生什么特別的神奇的變化。這兩個(gè)內(nèi)部類是完全獨(dú)立的兩個(gè)實(shí)體,各自在自己的命名空間內(nèi)
11)內(nèi)部類的標(biāo)識(shí)符:外圍類的名字,加上‘$’,再加上內(nèi)部類的名字,比如OuterClass$InnerClass;對(duì)了匿名內(nèi)部類,編譯器會(huì)簡單地產(chǎn)生一個(gè)數(shù)字作為其標(biāo)識(shí)符,比如OuterClass$1
12)局部內(nèi)部類VS匿名內(nèi)部類
a. 局部內(nèi)部類可以提供一個(gè)構(gòu)造器,方便重載構(gòu)造器,而匿名內(nèi)部類只能用于實(shí)例初始化
b. 局部內(nèi)部類可以被使用多次,然而匿名內(nèi)部類只能實(shí)例化一次