明明白白Java內(nèi)部類

??????? 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ǔ)法:

語(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)部類,如下圖所示:

語(yǔ)法

??????? 內(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)間接使用。

訪問(wèn)外部類成員

??????? 內(nèi)部類可以被public、private、protected和默認(rèn)包訪問(wèn)權(quán)限修飾(普通類只能被public和默認(rèn)包訪問(wèn)權(quán)限修飾)。

??????? 靜態(tài)內(nèi)部類的實(shí)例化語(yǔ)法如下:

靜態(tài)內(nèi)部類的實(shí)例化

??????? 普通內(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ǔ)法如下:

普通內(nèi)部類的實(shí)例化

現(xiàn)在還剩下兩個(gè)特殊的非靜態(tài)內(nèi)部類:局部類匿名類

局部類是指定義在一個(gè)方法體內(nèi)的類

局部?jī)?nèi)部類

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

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)部類中定義靜態(tài)成員

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

匿名類實(shí)例化

??????? 特別適合于只使用一次的類。匿名類和局部?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ī)則如下:

訪問(wèn)成員

?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java 內(nèi)部類 分四種:成員內(nèi)部類、局部?jī)?nèi)部類、靜態(tài)內(nèi)部類和匿名內(nèi)部類。 1、成員內(nèi)部類: 即作為外部類的一個(gè)成...
    ikaroskun閱讀 1,349評(píng)論 0 13
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,633評(píng)論 18 399
  • 一:java概述:1,JDK:Java Development Kit,java的開(kāi)發(fā)和運(yùn)行環(huán)境,java的開(kāi)發(fā)工...
    ZaneInTheSun閱讀 2,800評(píng)論 0 11
  • 一、繼承 當(dāng)兩個(gè)事物之間存在一定的所屬關(guān)系,即就像孩子從父母那里得到遺傳基因一樣,當(dāng)然,java要遺傳的更完美,這...
    玉圣閱讀 1,115評(píng)論 0 2
  • 我們唯一能掌控的其實(shí)只有當(dāng)下的自己。 活在呼吸一瞬間 過(guò)去 , 未來(lái), 都不能掌控 過(guò)去的不能改變 將來(lái)的改變不了...
    麋的鹿閱讀 337評(píng)論 0 2

友情鏈接更多精彩內(nèi)容