標籤:
儘管內部類的使用違背了Java要比C++更加簡單的設計理念,但是所謂存在即合理,內部類可以對同一個包中的其他類隱藏起來,內部類方法可以訪問該類定義所在範圍中的資料,包括私人的資料,某些情況下使用匿名內部類的解決方案更簡短易於理解。
內部類是定義在另一個類中的類。既可以定義在類中,也可以定義在類的方法中。
內部類的對象有一個隱式引用,它引用了執行個體化該內部對象的外部類對象,因此,通過這個指標,可以訪問外部類的全部狀態,內部類既能訪問自身的資料域,又能訪問建立它的外部類對象的資料域。注意:static內部類沒有這種附加指標。
下面分別介紹局部內部類 靜態內部類 和 匿名內部類。在介紹之前,簡單說下Java中的static 和final 關鍵字作用。
final 關鍵字
修飾屬性 表示屬性值初始化後不可改變;
修飾方法,表示方法不可覆寫,編譯器遇到調用final方法時會轉入內嵌機制,大大提高執行效率;
修飾類,表示類不可被繼承,沒有子類。
final關鍵字有無法被改變 終態的意思,可修飾局部變數,執行個體變數,靜態變數,在建立之後,只能夠賦值一次,但是定義時不必初始化。(介面中final屬性必須初始化)還可修飾形參,表示讀取參數,但無法改變參數的值。
static關鍵字
修飾屬性,表示公用屬性,所有執行個體對象共用,又叫類屬性,靜態屬性;JVM只為靜態變數分配一次記憶體,在記憶體中不管多少執行個體也只有一個拷貝。
修飾方法,表示類方法,和類屬性一樣,都可直接通過類名直接存取。
修飾內部類,不能修飾普通類。
static代碼塊,JVM載入類時會執行這些靜態代碼塊,如果有多個,按出現順序依次執行,每個代碼塊只會被執行一次。
局部內部類
在外部類的方法中實現的類,對外部世界完全隱藏,除了改方法,沒有其他方法知道該類的存在。局部類不能用public和private訪問說明符進行申明。它的範圍限定在這個局部類的塊中。與其他內部類相比,局部內部類不僅能夠訪問其外部類的狀態,還可以訪問定義其的方法中的局部變數,但必須是final類型的局部變數。
匿名內部類
內部類也可以繼承一個類或實現一個介面,假如只建立這個類的一個對象,就不必命名了。建構函式的名字與類名相同,匿名類沒有類名,所以沒有建構函式,取而代之的是,將構造器參數傳遞給父類建構函式;如果內部類實現介面,不能有任何建構函式。
靜態內部類
有時候,使用內部類只是為了把一個類隱藏在另外一個類的內部,並不需要內部類引用外部類對象。為此,可以將內部類申明為static,以便取消產生的引用。這時,內部類就不能訪問外部類的狀態了。
Java內部類