“嗨,阿米戈!”

“嗨,艾莉!”

“今天我們有一個很有意思的話題,今天我要給大家講講嵌套類。”

“如果一個類聲明在另一個類內部,那麼它就是一個嵌套類。非靜態嵌套類稱為內部類。”

“內部類的對象嵌套在外部類的對像中,因此可以訪問外部類的變量。”

例子
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 對象的高度變量並返回門的高度。”

嵌套類 - 1

“Door 對像不能獨立於 Car 對象而存在。畢竟,它使用 Car 對象的變量。編譯器在構造函數和 Door 類中無形地添加了對外部 Car 對象的引用,因此內部 Door 類的方法可以訪問外部 Car 類的變量並調用其方法。”

“嵌套對象。對我來說很有意義。從圖表來看,一切都非常簡單。”

“就是這樣。除了一些細微差別。”

“內部 Door 類引用了 Car 對象,因此:”

1) 不能在 Car 類的靜態方法中創建 Door 對象,因為靜態方法不包含對隱式傳遞給 Door 構造函數的 Car 對象的引用。

正確的 不正確
public class Car
{
 public static Door createDoor()
 {
  Car car = new Car();
  return car.new Door();
 }

 public class Door
 {
  int width, height;
 }
}
public class Car
{
 public static Door createDoor()
 {
  return new Door();
 }

 public class Door
 {
  int width, height;
 }
}

2) Door 類不能包含靜態變量或方法。

正確的 不正確
public class Car
{
 public int count;
 public int getCount()
 {
  return count;
 }

 public class Door
 {
  int width, height;
 }
}
public class Car
{

 public class Door
 {
  public static int count;
  int width, height;

  public static int getCount()
  {
   return count;
  }
 }
}

“如果我需要一個由所有 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’:”

如何訪問外部(或任何其他)類的“this”
Car.this
Car.Door.this
Car.Door.InnerClass2.InnerClass3.this

“所以,如果我們在內部類的方法中寫‘this’,那麼‘this’指的是內部類?”

“對,就是這樣。”

“你覺得內部類怎麼樣,阿米戈?”

“它們非常有趣。我不會說它們太難了。”

“有很多限制,但在你解釋了這些限制的來源和存在原因後,它們似乎很合乎邏輯。”

“另外,我已經在任務中編寫嵌套類兩個月了,但直到現在我才意識到我真正在寫什麼。”

“謝謝你的偉大教訓,艾莉。”

“我很高興你喜歡它,阿米戈。”