java內部類作用


為什么在Java中需要內部類?總結一下主要有以下四點:

  1.每個內部類都能獨立的繼承一個接口的實現,所以無論外部類是否已經繼承了某個(接口的)實現,對於內部類都沒有影響。內部類使得多繼承的解決方案變得完整,

  2.方便將存在一定邏輯關系的類組織在一起,又可以對外界隱藏。

  3.方便編寫事件驅動程序

  4.方便編寫線程代碼

  個人覺得第一點是最重要的原因之一,內部類的存在使得Java的多繼承機制變得更加完善。

◆Java內部類

一、 含義


在Java編程語言里,程序是由類(class)構建而成的。在一個類的內部也可以聲明類,我們把這樣的類叫做內部類。

二、 作用


實現了更好的封裝,我們知道,普通類(非內部類)的訪問修飾符不能為private或protected,而內部類可以。當我們將內部類聲明為private時,只有外部類可以訪問內部類,很好地隱藏了內部類。

內部類可以繼承(extends)或實現(implements)其他的類或接口,而不受外部類的影響。

內部類可以直接訪問外部類的字段和方法,即使是用private修飾的,相反的,外部類不能直接訪問內部類的成員。

三、 原理


內部類是一個編譯時的概念,編譯后會生成兩個獨立的class文件,如下:

編譯后的文件如下圖:

編譯后Outer.Inner被重命名為Outer$Inner,句點(.)被替換成了美元符號($)。

四、 分類


Java內部類可分為成員內部類、局部內部類、匿名內部類、靜態內部類。

1) 成員內部類

成員內部類可以看成是外部類的一個成員,在成員內部類中無法聲明靜態成員,但staticfinal字段是個例外。我們知道加載類時,會先初始化靜態成員,如果成員內部類有靜態成員,那么內部類就會在外部類之前生成,而內部類是為外部類服務的,內部類在外部類之前就生成可能會脫離掌控。在實例化成員內部類時,成員內部類會持有一個外部類當前對象的引用,這樣在成員內部類中就可以直接訪問外部類的成員,即使是private修飾的。

運行結果:

inner

outer

outer

成員內部類對外部類對象的引用,是通過在this前面加上外部類的名字構成的,這種形式叫作限定-this,out.println(outerName)與out.println(Outer.this.outerName)是等價的。

2) 局部內部類

局部內部類的使用和成員內部類的使用基本一致,只是局部內部類定義在外部類的方法中,就像局部變量一樣,並不是外部類的成員。局部內部類在方法外是無法訪問到的,但它的實例可以從方法中返回,並且實例在不再被引用之前會一直存在。局部內部類也可以訪問所在方法的局部變量、方法參數等,限制是局部變量或方法參數只有在聲明為final時才能被訪問。

運行結果:

outer:lalala

3) 匿名內部類

可以把匿名內部類想象成是沒有類名的局部內部類,匿名內部類有以下特點:

1、匿名內部類不能有構造器,匿名內部類沒有類名,肯定無法聲明構造器。

2、匿名內部類必須繼承或實現一個接口,指定給new的類型為匿名類的超類型,匿名類不能有顯示的extends或implements子句,也不能有任何修飾符。

3、匿名內部類和成員內部類、局部內部類一樣,也不能聲明靜態成員。

運行結果:

outer:lalala

4) 靜態內部類

靜態內部類,有的書上也稱為嵌套類,聲明它時需要用static修飾符,靜態內部類不同於前三種內部類,靜態內部類不會持有外部類當前對象的引用,所以在靜態內部類中無法訪問外部類的非靜態成員,可以這么說,靜態內部類不依賴於外部類。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM