爲何使用內部類?
每一個內部類都能獨立地繼承自一個(接口的)實現,因此不管外部類是否已經繼承了某個(接口的)實現,對於內部類沒有影響。函數
- 成員內部類
- 內部類對於外部類來講,至關於一個成員變量。內部類可使用任意訪問控制符
- 內部類的方法能夠直接訪問外部類的數據,而不受訪問控制符的影響
- 建立內部類對象方法:外部類.內部類 對象名 = 外部類對象.new 內部類()
- 編譯以後產生兩個class文件:Outer.class 和 Outer$Inner.class
- 內部類中不能存在任何static的變量和方法
- 爲啥?由於靜態變量和方法不依賴對象,僅與類有關。在加載靜態域時,根本沒有外部類。因此在非靜態內部類中不能定義static變量和方法,編譯會不經過。
- 靜態內部類:用static修飾的內部類
- 靜態內部類訪問外部類的非靜態成員:不能直接訪問,須要 new 外部類().成員
- 若是訪問外部類的static成員(名稱與內部類相同):「類名.靜態成員」
- 若是訪問外部類的static成員(名稱與內部類不相同):"靜態成員名"
- 建立靜態內部類對象(不須要外部類對象):外部類.內部類 對象名 = new 外部類.內部類()
- 方法內部類:訪問僅限與方法內(或者該做用域內)
- 局部內部類就像方法裏的局部變量同樣,不能用public protected private static修飾的
- 只能訪問方法中定義的final類型的局部變量。緣由:局部變量會隨着方法體執行完而消亡。但內部類對象還存在。(致使內部類要訪問一個不存在的局部變量)(使用final不只會保持對象的引用,還會讓編譯器持續維護這個對象在回調方法中的生命週期)(局部內部類並非直接調用方法傳進來的參數,而是內部類經過構造器將參數備份一份)
- 匿名內部類
- 匿名內部類直接使用 new 來生成一個對象的引用
- 缺點:僅能被使用一次
- 使用匿名內部類必須繼承一個類或者實現一個接口(二者不可兼得)
- 匿名內部類不能有構造函數,不能存在任何靜態成員變量和靜態方法
- 匿名內部類不能是抽象的必須實現繼承的類或者實現的接口的全部抽象方法
- 匿名內部列初始化:使用構造代碼塊。使用構造代碼塊可以達到爲匿名內部類建立一個構造器的效果。