1.成員內部類(lèi)
可以把一個(gè)內部類(lèi)看做一個(gè)成員。成員內部類(lèi)可以無(wú)條件訪(fǎng)問(wèn)外部類(lèi)的所有成員屬性和成員方法。
當成員內部類(lèi)擁有和外部類(lèi)同名的成員變量或者方法時(shí),默認情況下訪(fǎng)問(wèn)的是成員內部類(lèi)的成員。如果要訪(fǎng)問(wèn)外部類(lèi)的同名成員,需要以下面的形式進(jìn)行訪(fǎng)問(wèn):
成員內部類(lèi)是依附外部類(lèi)而存在的,也就是說(shuō),如果要創(chuàng )建成員內部類(lèi)的對象,前提是必須存在一個(gè)外部類(lèi)的對象。創(chuàng )建成員內部類(lèi)對象的一般方式如下:
2.局部?jì)炔款?lèi)
局部?jì)炔款?lèi)就像是方法里面的一個(gè)局部變量一樣,是不能有public、protected、private以及static修飾符的。
3.嵌套內部類(lèi)
嵌套內部類(lèi),就是修飾為static的內部類(lèi)。聲明為static的內部類(lèi),不需要內部類(lèi)對象和外部類(lèi)對象之間的聯(lián)系,就是說(shuō)我們可以直接引用outer.inner,即不需要創(chuàng )建外部類(lèi),也不需要創(chuàng )建內部類(lèi)。


4.匿名內部類(lèi)
匿名內部類(lèi)是我們使用最多的,因為我們并不想給它賦予名字,于是就有了匿名。匿名內部類(lèi)需要提前定義的。

5.閉包和回調
閉包(Closure)是一種能被調用的對象,它保存了創(chuàng )建它的作用域的信息。JAVA并不能顯式地支持閉包,但是在JAVA中,閉包可以通過(guò)“接口+內部類(lèi)”來(lái)實(shí)現。
例如:一個(gè)接口程序員和一個(gè)基類(lèi)作家都有一個(gè)相同的方法work,相同的方法名,但是其含義完全不同,這時(shí)候就需要閉包。

閉包實(shí)現代碼如下:

在子類(lèi)中定義了遵循程序員接口規則的內部類(lèi),然后使用內部類(lèi)實(shí)現程序員的work()方法回調code()方法,在子類(lèi)中直接實(shí)現父類(lèi)作家的work()方法。
6.內部類(lèi)的作用
內部類(lèi)可以很好的實(shí)現隱藏。
一般的非內部類(lèi),是不允許有 private 與protected權限的,但內部類(lèi)可以
內部類(lèi)擁有外圍類(lèi)的所有元素的訪(fǎng)問(wèn)權限
可是實(shí)現多重繼承
可以避免修改接口而實(shí)現同一個(gè)類(lèi)中兩種同名方法的調用。

文/breakingsword(簡(jiǎn)書(shū)作者)
原文鏈接:http://www.jianshu.com/p/367b138fe909
聯(lián)系客服