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