Java內部類的本質:

本質:

1、內部類與包含它的外部類有比較緊密的關係,而與其他類關係不大,定義在類的內部,可以實現對外部的完全隱藏,可以有更好的封裝性,代碼實現上也更簡潔。

2、內部類只是一個Java編譯器的概念,對於Java虛擬機而言,它不知道有內部類存在,Java編譯器在編譯的時候,每個內部類最後都會編譯爲一個獨立的類(外部類$內部類名.class)

3、內部類可以方便地訪問外部類的私有變量,可以聲明爲private從而對外完全隱藏,相關代碼寫在一起,寫法也更爲簡潔。


Java中主要分爲四種內部類:

1、靜態內部類

  使用:通過 ”new 外部類.靜態內部類“ 實例化即可

  使用場景:與外部關係密切,且不依賴與外部類實例,可以考慮使用靜態內部類。 

  具體案例:Integer類裏面有私有的靜態內部類IntegerCache,用於支持整數的自動裝箱

2、成員內部類(與靜態內部類類似)

  使用:必須通過外部類的實例來實例化:“Outer.Innet inner = new Outter().new Inner()"

  使用場景:內部類與外部類關係密切,需要訪問外部類的實例變量和方法。(其他類不會使用該內部類)

  具體案例:LinkedList中的有成員內部類ListItr和DescendingIterator

  實現原理:編譯後,編譯器給外部類內新增訪問內部類私有變量的靜態非私有方法,從而實現私有內部類變量和外部類的交互 

3、方法內部類

  使用:只能在定義的方法使用,方法不是靜態方法,則可以訪問外部的靜態,非靜態變量和方法,如果是靜態方法,則只能訪問外部類的靜態變量和方法;若內部類想訪問方法的參數,局部變量,這些變量必須爲final,因爲獲取的實際是自己的實例變量。

  使用場景:功能是可以用成員內部類代替的,但是如果只需要在某個方法裏面使用,這樣封裝性更好。

  實現原理:編譯器會給外部類額外添加一個靜態方法供內部類訪問外部類的成員變量; 內部類自身會把一個外部類作爲自己的一個成員變量,因此內部類訪問外部類的方法變量,實際上是訪問自己的成員變量。

4、匿名內部類(與方法內部類類似)

  使用:new 父類(參數表) {內部類實現}

  使用場景:匿名內部類能做的方法內部類也能做,但是如果不需要構造方法,只創建一次,可以使用匿名內部類,書寫更簡潔

  實現原理:跟方法內部類類似

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章