??????? Java內(nèi)部類一直是很多Java初學(xué)者迷惑的地方,今天我來(lái)系統(tǒng)地梳理一下Java內(nèi)部類的相關(guān)知識(shí)點(diǎn)。
??????? Java內(nèi)部類允許你在一個(gè)類的內(nèi)部定義一個(gè)類,這句話就是Java內(nèi)部類的定義。很多人說(shuō)這句話挺簡(jiǎn)單,但其實(shí)往往簡(jiǎn)單的東西不見(jiàn)得簡(jiǎn)單,Java內(nèi)部類就是一個(gè)典型代表。
??????? 首先我們來(lái)看一下Java內(nèi)部類的語(yǔ)法:

??????? 代碼中很容易看出來(lái)OutterClass是外部類(enclosing class),InnerClass是內(nèi)部類(nested class)。這就是語(yǔ)法規(guī)則。很簡(jiǎn)單吧。
??????? 下面開(kāi)始來(lái)點(diǎn)復(fù)雜的內(nèi)容了,汽車(chē)發(fā)動(dòng),大家系好安全帶哦~
??????? 1.內(nèi)部類包括靜態(tài)內(nèi)部類和非靜態(tài)內(nèi)部類,如下圖所示:

??????? 內(nèi)部類是外部類的一個(gè)成員,非靜態(tài)內(nèi)部類可以訪問(wèn)外部類的所有成員(包括外部類中的private成員),靜態(tài)內(nèi)部類不可以訪問(wèn)外部類的非靜態(tài)成員。靜態(tài)內(nèi)部類與外部類相聯(lián)系,因此靜態(tài)內(nèi)部類不能直接訪問(wèn)外部類的非靜態(tài)成員,只能通過(guò)一個(gè)對(duì)象引用來(lái)間接使用。

??????? 內(nèi)部類可以被public、private、protected和默認(rèn)包訪問(wèn)權(quán)限修飾(普通類只能被public和默認(rèn)包訪問(wèn)權(quán)限修飾)。
??????? 靜態(tài)內(nèi)部類的實(shí)例化語(yǔ)法如下:

??????? 普通內(nèi)部類(非靜態(tài)內(nèi)部類)與外部類的實(shí)例相聯(lián)系,可以直接訪問(wèn)外部?jī)?nèi)的所有成員。正因?yàn)槠胀▋?nèi)部類與外部類的實(shí)例聯(lián)系,因此不能在其內(nèi)部定義靜態(tài)成員。普通內(nèi)部類的實(shí)例化語(yǔ)法如下:

現(xiàn)在還剩下兩個(gè)特殊的非靜態(tài)內(nèi)部類:局部類和匿名類
局部類是指定義在一個(gè)方法體內(nèi)的類

局部?jī)?nèi)部類可以訪問(wèn)外部類的所有成員、方法的局部變量、方法的形參。在Java SE8之前,局部?jī)?nèi)部類訪問(wèn)局部變量和形參時(shí)局部變量和形參不許被修飾為final,在Java SE8中,不在需要這樣了,只要局部變量和形參不被二次賦值即可,如下圖所示:

? ? ? ? 局部?jī)?nèi)部類和普通內(nèi)部類是相似的因?yàn)樗麄兌疾荒鼙欢x或聲明靜態(tài)成員,如果局部?jī)?nèi)部類在靜態(tài)方法內(nèi)被定義那么這個(gè)局部?jī)?nèi)部類就只能訪問(wèn)方法的靜態(tài)成員。不能在局部?jī)?nèi)部類中聲明接口,因?yàn)榻涌诒旧砭褪庆o態(tài)的(inherently static)。局部?jī)?nèi)部類不能包含靜態(tài)成員除非這個(gè)靜態(tài)成員是常量(被final修飾)

匿名內(nèi)部類:沒(méi)有名字的內(nèi)部類

??????? 特別適合于只使用一次的類。匿名類和局部?jī)?nèi)部類一樣,可以訪問(wèn)外部類的成員(必須是final或沒(méi)有二次賦值的成員)。不能在匿名類中聲明靜態(tài)成員和接口(同局部?jī)?nèi)部類),除非靜態(tài)成員被final修飾。
??????? 可以在匿名類中定義的內(nèi)容有:成員、額外的方法、實(shí)例、局部?jī)?nèi)部類。
??????? 不能在匿名類中聲明構(gòu)造函數(shù)
關(guān)于內(nèi)部類和外部類的成員訪問(wèn)也很簡(jiǎn)單(討論外部類和內(nèi)部類成員名稱一樣的情況,不一樣直接訪問(wèn)就是了),上述四種內(nèi)部類通用,規(guī)則如下:

?