四種內部類inner class,匿名內部類_聽韓順平課筆記
1.四種內部類
一個類的內部又完整的嵌套了另一個類的結構,被巢狀的類稱為內部類(inner class)
- 內部類的最大特點就是:可以直接訪問私有屬性,並且可以體現類與類之間的包含關係
內部類的基本語法:
內部類的劃分:
2.區域性內部類1
區域性內部類的特點:
- 區域性內部類是定義在外部類的區域性位置,通常在方法中
- 區域性內部類本質還是一個類,五大成員都可以有(屬性,方法,構造器,程式碼塊,內部類)
- 可以訪問外部類的所有成員,包括私有成員
- 不能新增訪問修飾符,但可以用final修飾(相當於一個區域性變數,加了final該類則不可被繼承)
- 作用域:僅僅在定義它的方法或程式碼塊中(相當於一個區域性變數)
- 區域性內部類訪問,外部類成員的方式:直接訪問
- 外部類訪問,區域性內部類成員的方式:建立區域性內部類物件
3.區域性內部類2
外部類和區域性內部類的成員重名時,訪問外部類成員的方法(外部類名.this.成員)。外部類名.this,指的是外部類的物件,直接用this則是內部類的物件
區域性內部類細節:
4.匿名Anonymous內部類的本質,基於介面的匿名內部類使用
匿名內部類:
- 本質還是一個類
- 內部類
- 沒有名字(匿名內部類的名字由系統分配)
- 同時還是一個物件
匿名內部類簡化開發:只使用一次的類,寫成匿名內部類
匿名內部類的執行型別就是:外部類名$1(基於介面的匿名內部類)
- 匿名內部類的編譯型別是什麼
- 匿名內部類的執行型別是什麼
jdk底層在建立匿名內部類時,立即就建立了匿名內部類的例項,並把地址返回給物件引用
匿名內部類使用一次,就不能再使用了,但接收匿名內部類例項的物件引用tiger,可以反覆呼叫
5.匿名內部類的使用,基於類的匿名內部類使用
基於類的匿名內部類使用:
- 編譯型別是什麼
- 執行型別是什麼:外部類名$2(基於類的匿名內部類,數字是系統自動順序編號的)
底層建立匿名內部類:可以重寫該類中的方法
同時也直接返回了匿名內部類的物件:
- 引數列表("Jack")會傳遞給Father類的構造器
基於抽象類的匿名內部類,必須實現抽象類中的方法
6.匿名內部類的細節
匿名內部類既是一個類的定義,同時它本身也是一個物件,因此從語法上看,它既有定義類的特徵,也有建立物件的特徵
- 兩種呼叫匿名內部類的方法
系統自動建立匿名內部類,繼承了Person,所以super.ok(str),呼叫的就是Person類中的ok方法(多型)
匿名內部類使用細節:
7.匿名內部類實踐
匿名內部類最佳實踐:當作實參直接傳遞,簡潔高效(只用一次)
傳統方法-硬編碼,建立一個類實現介面,然後通過new建立例項呼叫
練習題:傳遞一個匿名內部類,根據傳進內部類的不同,列印不同資訊
答案:編譯型別是Bell,執行型別是變化的(動態繫結)
匿名內部類的難點:
8.成員內部類1
- 成員內部類定義的位置,在外部類的成員(屬性方法)位置
- 可以新增任意的訪問修飾符,因為它的地位就是一個成員
9.成員內部類2
外部其他類也可以訪問成員內部類——三種方法:
方式一:將成員內部類當成外部類的一個成員進行呼叫/例項化
方式二:在外部類中定義一個方法,返回成員內部類例項
方式三:方式一與二結合(會前兩種即可)
外部類與成員內部類成員重名問題:就近原則,
- 可以通過 外部類名.this.屬性 的方式來訪問外部類成員
10.靜態內部類1
- 靜態內部類,定義在外部類成員位置,有static修飾
- 靜態內部類只能訪問靜態成員
- 可以新增任意的訪問修飾符
- 作用域為整個類體
11.靜態內部類2
- 靜態內部類的屬性訪問問題:
- 外部其他類訪問靜態內部類的方式:
方式一:通過 類名. 直接訪問(前提是滿足訪問許可權)
方式二:編寫一個方法,返回靜態內部類的物件例項(非靜態方法)
方式三:將方式二中的方法改為靜態的(靜態方法)
靜態內部類成員重名問題
小結:
12.練習
能否輸出的問題:檢視訪問許可權