Java-InnerClass-03
來源:互聯網
上載者:User
Java內部類:名字隱藏+程式碼群組織
當產生一個內部類的對象時,此對象與製造它的外圍對象(enclosing object)之間就有了一種聯絡:它能訪問其外圍對象的所有成員,而不需要任何條件.此外,內部類還擁有其外圍類的所有元素的訪問權.
為什麼內部類會自動擁有對其外圍類所有成員的訪問權:當外圍類的對象建立了一個內部類對象時(內部類的對象只能在與其外圍類的對象相關聯的情況下才能被建立.構建內部類對象時,需要一個指向其外圍類對象的引用,如果編譯器訪問不到這個引用就會報錯),此內部類對象必定會儲存一個指向外圍類對象的引用.然後,在你訪問此外圍類的成員時,就是用那個"隱藏的"引用來選擇外圍類的成員.interface Selector...{
boolean isEnd();
Object current();
void next();
}
/**//*Sequence類只產生了一個Object數組,Selector介面:檢查序列是否到末尾;查看當前對象;移到序列中下一個對象(這是一個完整的操作,所以設定為獨立模組).*/
class Sequence...{
private int next = 0;
private Object obj[];
Sequence(int size)...{
obj = new Object[size];
}
public void addToSequence(Object element)...{
if(next<obj.length)
obj[next++] = element;
/**//*因為數組是Object的,所以要把int型的element轉換成一個對象,String是一種對象,而Object是所以對象的基類,所以上面代碼屬於向上轉型.*/
}
private class SSelector implements Selector...{
private int i = 0;
public boolean isEnd()...{return i == obj.length;}
public Object current()...{return obj[i];}
public void next()...{if(i<obj.length)i++;}
/**//*三個方法都引用了外圍類中的obj欄位*/
}
public Selector getSelector()...{
return new SSelector();
}
}
class TestSequence...{
public static void main(String[] args) ...{
Sequence sequence = new Sequence(10);
Selector selector = sequence.getSelector();
for(int i=0;i<10;i++)
sequence.addToSequence(Integer.toString(i));
while(!selector.isEnd())...{
System.out.println(selector.current());
selector.next();
}
}
}