Java內部類


儘管內部類的使用違背了Java要比C++更加簡單的設計理念,但是所謂存在即合理,內部類可以對同一個包中的其他類隱藏起來,內部類方法可以訪問該類定義所在作用域中的數據,包括私有的數據,某些情況下使用匿名內部類的解決方案更簡短易於理解。

內部類是定義在另一個類中的類。既可以定義在類中,也可以定義在類的方法中。

內部類的對象有一個隱式引用,它引用了實例化該內部對象的外部類對象,因此,通過這個指針,可以訪問外部類的全部狀態,內部類既能訪問自身的數據域,又能訪問創建它的外部類對象的數據域。注意:static內部類沒有這種附加指針。

下面分別介紹局部內部類 靜態內部類 和 匿名內部類。在介紹之前,簡單說下Java中的static 和final 關鍵字作用。

final 關鍵字

修飾屬性 表示屬性值初始化後不可改變;

修飾方法,表示方法不可覆寫,編譯器遇到調用final方法時會轉入內嵌機制,大大提高執行效率;

修飾類,表示類不可被繼承,沒有子類。

final關鍵字有無法被改變 終態的意思,可修飾局部變量,實例變量,靜態變量,在創建之後,只能夠賦值一次,但是定義時不必初始化。(接口中final屬性必須初始化)還可修飾形參,表示讀取參數,但無法改變參數的值。

static關鍵字

修飾屬性,表示公共屬性,所有實例對象共享,又叫類屬性,靜態屬性;JVM只爲靜態變量分配一次內存,在內存中不管多少實例也只有一個拷貝。

修飾方法,表示類方法,和類屬性一樣,都可直接通過類名直接訪問。

修飾內部類,不能修飾普通類。

static代碼塊,JVM加載類時會執行這些靜態代碼塊,如果有多個,按出現順序依次執行,每個代碼塊只會被執行一次。

局部內部類

在外部類的方法中實現的類,對外部世界完全隱藏,除了改方法,沒有其他方法知道該類的存在。局部類不能用public和private訪問說明符進行申明。它的作用域限定在這個局部類的塊中。與其他內部類相比,局部內部類不僅能夠訪問其外部類的狀態,還可以訪問定義其的方法中的局部變量,但必須是final類型的局部變量。

匿名內部類

內部類也可以繼承一個類或實現一個接口,假如只創建這個類的一個對象,就不必命名了。構造函數的名字與類名相同,匿名類沒有類名,所以沒有構造函數,取而代之的是,將構造器參數傳遞給父類構造函數;如果內部類實現接口,不能有任何構造函數。

靜態內部類

有時候,使用內部類只是爲了把一個類隱藏在另外一個類的內部,並不需要內部類引用外部類對象。爲此,可以將內部類申明爲static,以便取消產生的引用。這時,內部類就不能訪問外部類的狀態了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章