java的內部類

weixin_34146805發表於2016-08-09

1.使用內部類的原因:
a.內部類方法可以訪問該類定義所在的作用域中的資料,包括私有資料
b. 內部類可以對同一個包中的其他類隱藏起來
c.當想要定義一個回撥函式又不想編寫大量程式碼時,使用匿名內部類比較便捷

2.內部類的物件總存在一個隱式引用,它指向了建立它的外部類物件。這個引用在內部類的定義中是不可見的。外部類的引用在構造器中設定,編譯器修改了所有內部類的構造器,新增一個外圍類的引用引數。如果內部類沒有定義構造器,那麼編譯器會為它生成一個帶有外部類引用的預設構造器。

3.內部類是一種編譯器現象,與虛擬機器無關。編譯器會把內部類翻譯成用$(美元符號)分割內部類名和外部類名的常規類檔案,而虛擬機器對此一無所知。

4.編譯器為了引用外圍類,生成了一個外圍類的例項域。

5.如果一個內部類使用的頻率很低,可以把它包裝在外部類的一個方法裡,稱為區域性內部類。區域性類不能使用public或private訪問說明符進行宣告,它的作用被限定在宣告這個區域性類的塊中。區域性類有一個優點,即對外部世界可以完全隱藏起來,除了包裹內部類的方法外沒有任何其他方法知道它的存在。

6.匿名內部類必須且只繼承一個類或一個介面,並且不能定義建構函式,也不能存在任何靜態成員變數和靜態方法。匿名內部類不能是抽象的,它必須實現繼承類或介面的所有抽象方法。

7.拷貝引用,為了避免引用值發生改變,例如被外部類的方法修改等,而導致內部類得到的值不一致,於是用final來讓該引用不可改變。故如果定義了一個匿名內部類,並且希望它使用一個其外部定義的引數,那麼編譯器會要求該引數引用是final的。

8.在內部類不需要訪問外圍類物件時,應該使用靜態內部類,靜態內部類就是在一個內部類前面用static修飾。所以靜態內部類只能訪問外部類的靜態變數和方法。靜態內部類的例項建立不用依賴外部類的例項,它可以師姐使用
OuterClass.InnerClass a=new OuterClass.InnerClass();來建立

相關文章