內部類:
定義:
定義在另外一個類中的類,就是內部類。
編譯後生成的兩個獨立的類:Outer.class 和Outer$Inner.class。
內部類的分類:
靜態內部類:靜態內部類定義在類中,任何方法外,用static修飾
靜態內部類只能訪問外部類的靜態成員。
在外部類的外部,要創建一個靜態內部類對象不需要外部類對象:
Outer.Inner in = new Outer.Inner();
在本類內部生成內部類對象的方式:
Inner in = new Inner();
成員內部類:作爲外部類的一個成員存在,與外部類的屬性、方法並列
在內部類中可以直接訪問外部類的私有屬性。
內部類和外部類的實例變量允許命名衝突。
在內部類中訪問實例變量:this.屬性
在內部類訪問外部類的實例變量:外部類名.this.屬性
在外部類的外部,要創建一個成員內部類對象,要首先建立一個外部類對象,然後再創建一個成員內部類對象。
Outer out = new Outer();
Outer.Inner in = out.new Inner();
在本類內部生成內部類對象的方式:
在靜態方法中:Inner in = new Outer().new Inner();
在非靜態方法中:Inner in = this.new Inner();
成員內部類不可以有靜態成員,這是因爲靜態屬性是在加載類的時候創建,這個時候內部類還沒有被創建。
局部內部類:在外部類的方法中定義的內部類
與局部變量類似,在局部內部類前不可以加修飾符public和private,其作用域爲定義它的代碼塊。
局部內部類不僅可以訪問外部類的實例變量,還可以訪問外部類的局部變量,但要求外部類的局部變量必須爲final的。
配合接口使用,來做到強制弱耦合。
在外部類的外部不可創建局部內部類對象,只能在局部內部類所在的方法中創建:
Inner in = new Inner();
匿名內部類:一種特殊的局部內部類
沒有名字,也沒有class、extends、implements關鍵字
用一種隱含的方式實現一個接口或繼承一個類,並且只能創建一次實例。
實現方式:在某個語句中,new 父類/父接口名字(){ 類體中實現方法 }