《Java編程思想》筆記 第十章 內部類
1.創建內部類對象
1.1 創建內部類對象(相當於new內部類對象) 外圍類對象.new 內部類( )。
1.2 創建內部類對象一種方法是 外圍類有一個方法返回內部類對象。
1.3 沒有外圍類對象就不能創建內部類對象,因為內部類對象會暗暗連接到外圍類對象上。
1.4 如果是嵌套類(靜態內部類)無需外圍類對象引用就可創建。Outer.Inner in = Outer.Inner();
2.創建內部類引用 in
- Outer.Inner in ,無論在什麽其他類內還是在所在的外圍類內。
- 內部類內創建外圍類對象引用out : Outer.this out
3. 匿名內部類
public Test f(){return new Test(){ // 從 Test() 到 ;之間就是匿名內部類,相當於一個類,並且繼承了Test //類數據成員 // new Test() 是匿名內部類的基類 //類方法 }; }
結果: 調用一次f()就創建了一個繼承自Test的匿名對象,並自動向上轉型為Test引用,並返回這個引用。
3.1 匿名內部類如果需要一個外圍類定義的對象那麽這個對象的參數一定是final
public Test f( finalString a1){ return new Test() { String s = a1; }; }
3.2 匿名內部類沒有名字也就談不上有構造器,若想在創建匿名對象時執行初始化行為就像構造器那樣,通過實例初始化,就可以做到構造器行為。
3.3 匿名內部類實現接口 ,只能實現一個接口
class A{ Animal f = new Animal() { @Overridepublic void fly() { // TODO Auto-generated method stub } }; }
3.4 匿名內部類擴展了基類,與extends繼承的類相比,匿名擴展類要麽擴展基類,要麽實現接口,不能倆者都具備。
4.嵌套類
- static 內部類 ,內外部類對象間無聯系。 static類就是一個單獨的存在,只是把它放在了一個類中。
4.1.嵌套類因為是靜態的所以不能訪問外圍類的非靜態成員對象
4.2.普通內部類不能有 static 字段和static數據成員,也不能再嵌套一個內部類,但嵌套類這些都可以有。
5.接口的內部類
- 因為接口中任何類自動都是public和static,故無需寫static也是嵌套
6.為什麽需要內部類
- 內部類可以解決部分多重繼承問題
- 內部類可以獨立繼承實現接口,與外圍類是否繼承了該接口無關。
- 內部類操作外圍類的對象,提供進入外圍類的窗口
7.閉包
閉包是對象,記錄了一些來自於創建它的作用域的對象。
8.什麽是回調。
- A給B發消息,B處理完後調用A的方法執行處理結果。
- 19.回調的靈活性: 在運行時動態的決定調用什麽方法。
9.繼承內部類
class B { class A { } } class C extends B.A { //C只繼承內部類 C(B b) { //創建C對象需要調用A的構造器,但調用A的構造器必須有B的引用 b.super(); //給C的構造器傳入一個B的引用,然後調用基類A的構造器 } }
註意: b.super()代表用B引用調用C類的基類構造器,而不是調用B基類的構造器
9.1 子類覆寫基類的內部類後,這兩個內部類就是兩個獨立的內部類,因為所在命名空間不同,與方法覆寫不同。
9.2 內部類可以繼承內部類,作為基類的內部類一定是Outer.Inner
10. 局部內部類
-------以後補充
知識點
1.多層嵌套中,不管嵌套了多少層它們總歸在一個類中,同一個類內成員間可以相互訪問(但要註意是不是static),哪怕是private
2.應用程序框架:是被用來以解決某些特定問題的一個類或者一組類。
3.控制框架是特殊的應用框架。
《Java編程思想》筆記 第十章 內部類