這裡模擬arraylist的實現為避免和系統的集合重名,這裡使用myarraylist作為類名。
public
class
myarraylist
implements
iterable
@override
public iteratoriterator()
class
arraylistiterator
implements
iterator
@override
public
void remove()
...}
}
這裡存在乙個問題,就是theitems[current ++]的使用時非法的,因為theitems不是arraylistiterator的成員,而是myarraylist 的成員。最簡單的解決辦法如下**所示:
public
class
myarraylist
implements
iterable
@override
public iteratoriterator()
class
arraylistiterator
implements
iterator
private
int current = 0;
@override
public
boolean hasnext()
@override
public
void remove()
...}
}
這種方式是通過內部類的建構函式儲存myarraylist的鏈,通過這個鏈就可以訪問包含於myarraylist中的陣列和其他方法。問題是,theitems是myarraylist中的私有成員,而arraylistiterator是乙個不同的類,因此在next方法中訪問theitems是非法的。最簡單的修改辦法就是講theitems的可見性修改為稍微寬鬆一點的許可權控制符,如default public 。但是這又違反了物件導向程式設計中要求資料盡可能隱蔽。
下面再給出乙個一種方案(巢狀內部類):
public
class
myarraylist
implements
iterable
@override
public iteratoriterator()
private
static
class
arraylistiterator
implements
iterator
private
int current = 0;
@override
public
boolean hasnext()
@override
public
void remove()
...}
}
該方案中arraylistiterator被實現為乙個巢狀類。既然有了巢狀類,那麼現在討論下內部類。當申明乙個內部類的時候,編譯器會新增乙個外部類物件的乙個隱式引用,該引用引起內部類的構造。如果外部類的名字是outer,則隱式引用就是outer.this。因此,如果arraylistiterator是作為乙個內部類被申明且沒有註明static,那麼myarraylist.this和thelist都會引用同乙個myarraylist。這樣,thelist就多餘了,並可能被刪除。
在乙個內部類物件恰好與乙個外部類物件關聯的情況下,內部類是有用的。這裡給出myarraylist類和迭代器之間的關係,此時這些內部類都用來實現這些迭代器。
thelist.theitems可以替換成myarraylist.this.theitems,等等。
對於巢狀內部類,有於它的創見不依賴於外部類物件。因此上面給出的方式是可行的。
java巢狀類和內部類詳解
可以在乙個類的內部定義另乙個類,這種類稱為巢狀類 nested classes 它有兩種型別 靜態巢狀類和非靜態巢狀類。靜態巢狀類使用很少,最重要的是非靜態巢狀類,也即是被稱作為內部類 inner 巢狀類 從jdk1.1開始引入。其中inner類又可分為三種 其一 在乙個類 外部類 中直接定義的內部...
Java靜態內部類 巢狀類
如果你不需要內部類物件與其外圍類物件之間有聯絡,那你可以將內部類宣告為static。這通常稱為巢狀類 nestedclass 想要理解static應用於內部類時的含義,你就必須記住,普通的內部類物件隱含地儲存了乙個引用,指向建立它的外圍類物件。然而,當內部類是static的時,就不是這樣了。巢狀類意...
JAVA內部類(內建類,巢狀類)
內部類訪問特點 1,內部類可以直接訪問外部類中的成員,包括私有成員 2,外部類要訪問內部類,必須建立內部類的物件 一般用於類的設計 分析事物a時,發現a的描述中還有事物b,而且b還在訪問a的內容 這時b被定義成內部類來描述 如人是乙個類,人身體中的心臟也是乙個類,而且心臟會訪問人體中的血液 血管等物...