“嗨,阿米戈!”
“嗨,艾莉!”
“今天我們有一個很有意思的話題,今天我要給大家講講嵌套類。”
“如果一個類聲明在另一個類內部,那麼它就是一個嵌套類。非靜態嵌套類稱為內部類。”
“內部類的對象嵌套在外部類的對像中,因此可以訪問外部類的變量。”
public class Car
{
int height = 160;
ArrayList doors = new ArrayList();
public Car
{
doors.add(new Door());
doors.add(new Door());
doors.add(new Door());
doors.add(new Door());
}
class Door()
{
public int getDoorHeight()
{
return (int)(height * 0.80);
}
}
}
“注意 Door 類有一個 getDoorHeight 方法。它使用 Car 對象的高度變量並返回門的高度。”
“Door 對像不能獨立於 Car 對象而存在。畢竟,它使用 Car 對象的變量。編譯器在構造函數和 Door 類中無形地添加了對外部 Car 對象的引用,因此內部 Door 類的方法可以訪問外部 Car 類的變量並調用其方法。”
“嵌套對象。對我來說很有意義。從圖表來看,一切都非常簡單。”
“就是這樣。除了一些細微差別。”
“內部 Door 類引用了 Car 對象,因此:”
1) 不能在 Car 類的靜態方法中創建 Door 對象,因為靜態方法不包含對隱式傳遞給 Door 構造函數的 Car 對象的引用。
正確的 | 不正確 |
---|---|
|
|
2) Door 類不能包含靜態變量或方法。
正確的 | 不正確 |
---|---|
|
|
“如果我需要一個由所有 Door 對象共享的變量怎麼辦?”
“你總是可以簡單地在 Car 類中聲明它。然後它將被嵌套在 Car 對像中的所有 Door 對象共享。”
3)注意:如果內部類聲明為public,則可以在外部類之外創建它的實例,但必須先存在外部類的實例:
Car car = new Car();
Car.Door door = car.new Door();
Car.Door door = new Car().newDoor();
4)還有一條我差點忘了的評論。
“由於我們有兩個嵌套對象,內部對象的方法可以訪問兩個名為‘this’的引用:”
public class Car
{
int width, height;
public class Door
{
int width, height;
public void setHeight(int height)
{
this.height = height;
}
public int getHeight()
{
if (height != 0)
return this.height;
else
return (int)(Car.this.height * 0.8);
}
}
“我故意在類中聲明了同名變量。”
“要在隱藏時從外部類訪問變量,或在內部類中訪問‘this’,只需編寫‘YourClassName.this’:”
Car.this
Car.Door.this
Car.Door.InnerClass2.InnerClass3.this
“所以,如果我們在內部類的方法中寫‘this’,那麼‘this’指的是內部類?”
“對,就是這樣。”
“你覺得內部類怎麼樣,阿米戈?”
“它們非常有趣。我不會說它們太難了。”
“有很多限制,但在你解釋了這些限制的來源和存在原因後,它們似乎很合乎邏輯。”
“另外,我已經在任務中編寫嵌套類兩個月了,但直到現在我才意識到我真正在寫什麼。”
“謝謝你的偉大教訓,艾莉。”
“我很高興你喜歡它,阿米戈。”
GO TO FULL VERSION