在介紹區(qū)別之前,首先把概念理一下,Java允許在一個(gè)類中定義另一個(gè)類,這樣的類被稱為
靜態(tài)嵌套類-聲明為另一個(gè)類的 靜態(tài)成員 內(nèi)部類-聲明為另一個(gè)類的 實(shí)例成員 本地內(nèi)部類-聲明在一個(gè)類的 實(shí)例方法中 匿名內(nèi)部類-類似本地內(nèi)部類,但它是 表達(dá)式,定義并返回一個(gè)只使用一次的對(duì)象
具體的用法,可以查看Oracle提供的JavaTutorial中的[ClassesandObjects]這一節(jié),這里就不在寫了,下面看下各種嵌套類的特點(diǎn)和區(qū)別。
靜態(tài)嵌套類
與類方法和字段一樣,與
外部類相關(guān)聯(lián) 無(wú)法直接訪問(wèn)外部類的實(shí)例方法或字段
除了位于外部類的命名空間中,在行為上與普通頂級(jí)類無(wú)異
它更多的目的是為了方便打包
內(nèi)部類
與實(shí)例方法和字段一樣,與
外部類的實(shí)例相關(guān)聯(lián) 可以直接訪問(wèn)該實(shí)例的私有方法和字段
無(wú)法定義自己的任何靜態(tài)成員
不能聲明interface,因?yàn)榻涌诒举|(zhì)是靜態(tài)的
本地內(nèi)部類
它是在
塊中定義的類,塊就是使用成對(duì)的大括號(hào)組成語(yǔ)句,比如for循環(huán) 類似內(nèi)部類,非靜態(tài),可訪問(wèn)外部類的私有成員
此外可訪問(wèn)局部變量和參數(shù),但它們必須為
final類型 可以聲明靜態(tài)的常量變量
匿名內(nèi)部類
主要提供更簡(jiǎn)潔和方便的代碼來(lái)使用本地內(nèi)部類,在聲明一個(gè)類的同時(shí)并實(shí)例化
與本地內(nèi)部類類似,可訪問(wèn)final類型的局部變量
與內(nèi)部類類似,可訪問(wèn)外部類的私有成員
不能聲明
構(gòu)造函數(shù),但可以聲明一個(gè)用于初始的 塊 此外可以聲明字段、額外的方法和
本地類
為什么使用嵌套類
使用嵌套類大概有三個(gè)原因:
邏輯分組-如果一個(gè)類只對(duì)另一個(gè)類有用,尤其是它不會(huì)在任何其他類中使用時(shí),使用嵌套類是將兩者是最合邏輯的。還能簡(jiǎn)化包結(jié)構(gòu),不必再新建一個(gè)文件 增強(qiáng)封裝-有兩個(gè)頂級(jí)類A和B,其中B需要訪問(wèn)A中聲明為private的成員,就可以通過(guò)將B嵌套在類A中實(shí)現(xiàn),此外對(duì)于外面的世界B是隱藏的 代碼更易讀和可維護(hù)-嵌套使得代碼更接近使用它的位置,帶來(lái)更易讀和可維護(hù)的代碼
何時(shí)使用嵌套類、本地類、匿名類
當(dāng)類只用于外部類并且它獨(dú)立于外部類的(私有)成員時(shí),使用
常見與GUI編程中,