簡單的說,內部類就是將一個類的定義放到另一個類的定義內部。內部類分為:成員內部類、局部內部類、靜態內部類、匿名內部類。
成員內部類:作為外部類的一個成員存在,與外部類的屬性、方法并列。
優點:一方面,內部類作為外部類的成員,可以訪問外部類的私有成員或屬性。(即使聲明為private,但是對于處于其內部的內部類還是可見的。)另一方面,可以內部類定義在外部類不可訪問的屬性。這樣就在外部類中實現了比外部類private還要小的額訪問權限。
注意:
內部類是一個編譯時的概念,一旦編譯成功,就會成為完全不同的兩個類。
對于一個名為Outer的外部類和其內部定義的名為Inner的內部類。編譯完成后出現Outer.class 和 Outer$Inner.class 兩個類
當Outer是一個private類時,外部類對于其外部訪問是私有的,所以就無法建立外部類對象,進而也無法建立內部類對象。
局部內部類
在方法中第一的內部類稱為局部內部類。
與局部變量類似,在局部內部類前不加修飾符public和private,其范圍為定義它的代碼塊
注意:
在類外不可直接生產局部內部類(保證局部內部類對外是不可見的)。
要想使用局部內部類時需要生產對象,對象調用方法,在方法中才能調用局部內部類。
通過內部類和接口達到一個強制的弱耦合,用局部內部類來實現接口,并在方法中返回接口類型,使局部內部類不可見,屏蔽實現類的可見性。
靜態內部類
靜態內部類可以使用public,protected,private修飾
靜態內部類中可以定義靜態和非靜態的成員
注意:
一個靜態內部類不需要一個外部類的成員:只是靜態內部類和成員內部類的區別。靜態內部類的對象可以直接生成
這實際上靜態內部類成為了一個頂級類。
靜態內部類不可用private來進行定義。
當類與接口(或者是接口與接口)發生方法命名沖突的時候,此時必須使用內部類來實現。用接口不能完全地實現多繼承,用接口配合內部類才能實現真正的多繼承。
匿名內部類
匿名內部類就是沒有名字的內部類。
注意:
匿名內部類不能有構造函數
匿名內部類不能定義任何靜態成員、方法和類
匿名內部類不能是public、protected、private、static
只能創建匿名內部類的一個實例
一個匿名內部類用其隱含實現一個接口或實現一個類。
因匿名內部類為局部內部類,所以局部內部類的所有限制都對其生效。