java學習之---內部類

1、內部類,顧名思義,一個類在另一個類的內部。那麼sun公司爲什麼會增加這個語言特性呢?學習內部類的語法和語義之前,我對這個問題比較好奇,查看了Thinking in Java,是這樣解釋的:

一般來說,內部類繼承自某個類或實現某個接口,內部類可以操作創建它的外圍類的對象,所以可以認爲內部類提供了某種進入其外圍類的窗口。這樣一來,就有一個問題了。如果只是需要實現一個接口,那麼爲什麼不通過外圍類實現那個接口呢?答案是:如果外圍類能夠滿足需求,那麼就用外圍類。但是二者實現接口的區別是,外圍類不是總能享用到接口帶來的方便,而內部類最吸引人的原因是:每個內部類都能獨立的繼承自一個(接口的)實現,所以無論外圍類是否已經繼承了某個(接口)的實現,對於內部類都沒有影響的。

如果沒有內部類提供的可以繼承多個具體或抽象的類的能力,一些設計與編程問題就很難解決。從這個角度看,內部類使得多重繼承的解決方案變得完整。接口解決了部分問題,而內部類有效的是實現了"多重繼承"。也就是說,內部類允許繼承多個非接口類型(類或抽象類)。

2、內部類的基本語法:

主要分爲成員內部類和局部內部類

(1)成員內部類:在類中引入一個類,和成員變量、方法同一級別

    1>  內部類有普通類的共有特性:繼承某個類、實現某個接口、可以是abstract、final、static等

    2>  非靜態成員內部類:

a: 內部類可以訪問外部類的所有成員(屬性和方法),即使這些成員是private的。因爲類中的private在類的任何範圍內都可見,當然在內部類中可見。內部類是通過指向外部類對象的引用來訪問這些成員的:outclass.this,默認是省略的。

b:非靜態內部類中不能有靜態的成員(屬性或方法)。

c:同理,外部類也可以訪問內部類的所有成員,即使這些成員是private

    3>  靜態成員內部類:

a:靜態成員內部類是類的範疇,沒有指向外部類的對象引用了,也就不能在內部類中使用外部類的非靜態方法。

b:靜態成員內部類中可以有靜態成員。

c:靜態成員內部類可以在外部類的靜態方法中使用。

(2)局部內部類:定義在方法中的內部類,與方法中的局部變量時同一級別。

     1>局部內部類只能在方法內使用,所以訪問控制符、static關鍵字對局部內部類是沒有意義的;但是可以用final修飾爲不可繼承。

     2>  非靜態方法中的局部內部類也包含了一個隱含的指向外部類對象的引用,通過這個引用,可以訪問外部類的成員;對於該方法內部的局部變量,若想在局部內部類中使用,則該變量需要是final的。

     3>  局部內部類不能包含靜態成員(變量和方法)

(3)匿名內部類:

     1>是內部類,但沒有名字;不能顯式的添加構造方法;沒有任何修飾符;無法繼承類或實現接口。

     2>  匿名內部類和抽象類型綁定在一起的,通過接口或抽象類來使用匿名內部類,語法是:

              new 抽象類型(構造方法參數){

                     實現抽象類型的抽象方法

               }

      3>  兩種抽象類型實現的形式相同,唯一的區別就是通過接口實現時,沒有構造方法的,而通過抽象類繼承時,就可以有構造方法。



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