"Merhaba, Amigo!"

"Merhaba Ellie!"

"Bugün çok ilginç bir konumuz var. Bugün size iç içe sınıflardan bahsedeceğim."

"Bir sınıf başka bir sınıfın içinde bildirilirse, o zaman bu iç içe bir sınıftır. Statik olmayan iç içe sınıflara iç sınıflar denir."

"Bir iç sınıfın nesneleri, dış sınıfın nesnelerinin içine yerleştirilmiştir ve bu nedenle dış sınıfın değişkenlerine erişebilir."

Örnek
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 sınıfının bir getDoorHeight yöntemi olduğunu unutmayın. Car nesnesinin yükseklik değişkenini kullanır ve kapının yüksekliğini döndürür."

İç içe sınıflar - 1

"Bir Door nesnesi, bir Car nesnesinden bağımsız olarak var olamaz. Sonuçta, Car nesnesinin değişkenlerini kullanır. Derleyici, yapıcıya ve Door sınıfına görünmez bir şekilde dış Car nesnesine bir referans ekler, böylece iç Door sınıfının yöntemleri dış Car sınıfının değişkenlerine erişebilir ve yöntemlerini çağırabilir."

"İç içe nesneler. Bana mantıklı geliyor. Diyagrama bakılırsa, her şey oldukça basit."

"Ve öyle. Birkaç nüans dışında."

"İç Door sınıfı, Car nesnesine bir referansa sahiptir, bu nedenle:"

1) Car sınıfının statik bir yöntemi içinde bir Door nesnesi oluşturamazsınız çünkü statik yöntemler, Door yapıcısına dolaylı olarak iletilen Car nesnesine bir başvuru içermez.

Doğru Yanlış
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 sınıfı, statik değişkenler veya yöntemler içeremez.

Doğru Yanlış
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;
  }
 }
}

"Peki ya tüm Door nesneleri tarafından paylaşılan bir değişkene ihtiyacım olursa?"

"Bunu her zaman Car sınıfında ilan edebilirsiniz. Ardından, bir Car nesnesine yuvalanmış tüm Door nesneleri tarafından paylaşılacaktır."

3) Not: Eğer iç sınıf public olarak bildirilirse, bunun örnekleri dış sınıfın dışında oluşturulabilir, ancak önce dış sınıfın bir örneği var olmalıdır:

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

4) Ve neredeyse unuttuğum bir yorum daha.

"İç içe geçmiş iki nesnemiz olduğundan, iç nesnenin yöntemlerinin 'this' adlı iki referansa erişimi vardır:"

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

"Sınıflarda kasıtlı olarak aynı ada sahip değişkenler bildirdim."

"Gizliyken dış sınıftan bir değişkene erişmek veya bir iç sınıf içinde 'buna' erişmek için, 'SınıfAdınız.this' yazmanız yeterlidir:"

Bir dış (veya başka herhangi bir) sınıfın 'buna' nasıl erişilir
Car.this
Car.Door.this
Car.Door.InnerClass2.InnerClass3.this

"Yani, bir iç sınıfın yönteminin içine 'this' yazarsak, o zaman 'this' iç sınıfı ifade eder?"

"Evet kesinlikle."

"İç sınıflar hakkında ne düşünüyorsun, Amigo?"

"Çok ilginçler. Çok zor olduklarını söyleyemem."

"Pek çok kısıtlama var, ancak bu kısıtlamaların nereden geldiğini ve neden var olduklarını açıkladıktan sonra oldukça mantıklı görünüyorlar."

"Ayrıca, iki aydır görevlerde iç içe sınıflar yazıyorum, ancak gerçekte ne yazdığımı ancak şimdi anlıyorum."

"Harika ders için teşekkürler, Ellie."

"Beğenmene sevindim, Amigo."