1. 程式人生 > 其它 >四種內部類inner class,匿名內部類_聽韓順平課筆記

四種內部類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.練習

能否輸出的問題:檢視訪問許可權