"Hai, Amigo!"

"Hai, Ellie!"

"Hari ini kita mempunyai topik yang sangat menarik. Hari ini saya akan memberitahu anda tentang kelas bersarang."

"Jika kelas diisytiharkan di dalam kelas lain, maka ia adalah kelas bersarang. Kelas bersarang bukan statik dipanggil kelas dalam."

"Objek kelas dalam bersarang di dalam objek kelas luar dan oleh itu boleh mengakses pembolehubah kelas luar."

Contoh
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);
  }
 }
}

"Perhatikan bahawa kelas Door mempunyai kaedah getDoorHeight. Ia menggunakan pembolehubah ketinggian objek Kereta dan mengembalikan ketinggian pintu."

Kelas bersarang - 1

"Objek Pintu tidak boleh wujud secara bebas daripada objek Kereta. Lagipun, ia menggunakan pembolehubah objek Kereta. Pengkompil secara tidak kelihatan menambah kepada pembina dan kelas Door rujukan kepada objek Kereta luar, supaya kaedah kelas Door dalam. boleh mengakses pembolehubah kelas Kereta luar dan memanggil kaedahnya."

"Objek bersarang. Masuk akal bagi saya. Berdasarkan gambar rajah, semuanya agak mudah."

"Dan begitulah. Kecuali beberapa nuansa."

"Kelas Pintu dalam mempunyai rujukan kepada objek Kereta, oleh itu:"

1) Anda tidak boleh mencipta objek Door dalam kaedah statik kelas Kereta, kerana kaedah statik tidak mengandungi rujukan kepada objek Kereta yang secara tersirat dihantar kepada pembina Pintu.

Betul tak betul
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) Kelas Door tidak boleh mengandungi pembolehubah statik atau kaedah.

Betul tak betul
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;
  }
 }
}

"Dan bagaimana jika saya memerlukan pembolehubah yang dikongsi oleh semua objek Door?"

"Anda sentiasa boleh mengisytiharkannya dalam kelas Kereta. Kemudian ia akan dikongsi oleh semua objek Door yang bersarang dalam objek Kereta."

3) Nota: jika kelas dalam diisytiharkan sebagai awam, contoh kelas itu boleh dibuat di luar kelas luar, tetapi contoh kelas luar mesti wujud terlebih dahulu:

Car car = new Car();
Car.Door door = car.new Door();
Car.Door door = new Car().newDoor();

4) Dan satu lagi komen yang saya hampir terlupa.

"Memandangkan kita mempunyai dua objek bersarang, kaedah objek dalam mempunyai akses kepada dua rujukan yang dipanggil 'ini':"

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);
 }
}

"Saya sengaja mengisytiharkan pembolehubah dengan nama yang sama dalam kelas."

"Untuk mengakses pembolehubah daripada kelas luar apabila ia disembunyikan, atau untuk mengakses 'ini' di dalam kelas dalam, cuma tulis 'NamaKelasAnda.ini':"

Bagaimana untuk mengakses 'ini' kelas luar (atau mana-mana yang lain).
Car.this
Car.Door.this
Car.Door.InnerClass2.InnerClass3.this

"Jadi, jika kita menulis 'ini' di dalam kaedah kelas dalaman, maka 'ini' merujuk kepada kelas dalaman?"

"Ya. Betul."

"Apa pendapat anda tentang kelas dalaman, Amigo?"

"Mereka sangat menarik. Saya tidak akan mengatakan mereka terlalu sukar."

"Terdapat banyak sekatan, tetapi ia kelihatan agak logik selepas anda menjelaskan dari mana datangnya sekatan itu dan mengapa ia wujud."

"Selain itu, saya telah menulis kelas bersarang dalam tugas selama dua bulan, tetapi baru sekarang saya menyedari apa yang sebenarnya saya tulis."

"Terima kasih atas pengajaran yang hebat, Ellie."

"Saya gembira awak menyukainya, Amigo."