標籤:style blog java color 使用 strong
一。成員內部類:與類的成員變數一樣
1 可以加任意的修飾:private, protected,頂級類只可以為public, default
2 內部類不可脫離其外部類的限制使用,因此在外部類以外建立內部類要這樣:
outerObject=new outerClass(Constructor Parameters);outerClass.innerClass innerObject=outerObject.new InnerClass(Constructor Parameters);
3 內部類對象可以訪問外部類的任意變數或方法(包括private變數或方法),因為Java編譯器在建立內部類對象時,隱式的把其外部類對象的引用
也傳了進去並一直儲存著.所以成員內部類和外部類的屬性有相同的生命週期)
4 在內部類中,外部類與內部類同名的成員會被屏蔽, 不過可以這樣訪問外部的同名屬性: OuterClass.this.field
5 非靜態內部類不能有靜態成員,因為它違背了成員類必須依賴外部類而存在的原則(靜態成員在Class被load的時候就初始化了)
6 內部類可以實現一個外部介面或抽象類別,外部類返回這樣的一個介面,以達到隱藏介面的實現的目的。如JDK中List的Iterator,map介面實現使用
集合非靜態內部類來實現它的集合視圖
一。靜態內部類:如同類的靜態成員一樣; 它和成員內部類的區別是它沒有指向外部類的引用
1 建立靜態內部類對象:
OuterClass.InnerClass obj = new OuterClass.InnerClass(params);
2 靜態內部類可以有非靜態成員
3 靜態內部類只能訪問外部類的靜態成員
4 靜態內部類的常見用法:作為輔助類,僅當與它的外部類一起使用時才有意義
5 私人靜態內部類的常見用法:用來代表外圍類所代表的對象的組件。例如:考慮一個Map執行個體,Map的實現裡面有一個Entry對象。雖然每個Entry
都與一個Map關聯,但entry上的方法(getKey,getValue,setValue)並不需要訪問該Map。因此,使用非靜態內部類來表示Entry是很浪費的:每個
Entry中將會包含一個指向該Map的引用 ,浪費了時間和空間。
三。局部內部類:方法體或者代碼片斷中定義的類
1 局部內部類前面不能有access修飾符(和定義局部變數一樣)
2 它有它自己的範圍,超出了這個範圍就無效
3 它可以訪問外部類的所有成員(因為外部類的成員對該方法可見)
4 定義在方法體中的內部類只能訪問該方法的final變數,原因:定義在方法體中的變數會隨著方法的退出而消亡,通過定義其為final變數,可以擴充其生命期
5 定義在代碼塊中的內部類只能使用在該block中定義的final變數
四。匿名內部類:在某些情況下,我們只需要內部類的一個對象,而不需要該類的名字
1 匿名內部類的執行個體化:
new SomeInterfaceOrClass(){......};
意思是創造一個實現(繼承)了SomeInterfaceOrClass的類的對象
2 定義匿名內部類的時候,如果用到外面的對象,需要把這個參數的引用聲明成final的
五。附源碼:
1.Entry
static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; Entry<K,V> next; final int hash; /** * Creates new entry. */ Entry(int h, K k, V v, Entry<K,V> n) { value = v; next = n; key = k; hash = h; } public final K getKey() { return key; } public final V getValue() { return value; } public final V setValue(V newValue) { V oldValue = value; value = newValue; return oldValue; } 。。。。。}