„Hallo, Amigo!“

„Hallo, Ellie!“

„Heute haben wir ein sehr interessantes Thema. Heute werde ich Ihnen etwas über verschachtelte Klassen erzählen.“

„Wenn eine Klasse innerhalb einer anderen Klasse deklariert wird, handelt es sich um eine verschachtelte Klasse. Nicht statische verschachtelte Klassen werden innere Klassen genannt.“

„Objekte einer inneren Klasse sind in Objekten der äußeren Klasse verschachtelt und können daher auf die Variablen der äußeren Klasse zugreifen.“

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

„Beachten Sie, dass die Door-Klasse über eine getDoorHeight-Methode verfügt. Sie verwendet die Höhenvariable des Car-Objekts und gibt die Höhe der Tür zurück.“

Verschachtelte Klassen – 1

„Ein Door-Objekt kann nicht unabhängig von einem Car-Objekt existieren. Schließlich verwendet es die Variablen des Car-Objekts. Der Compiler fügt dem Konstruktor und der Door-Klasse unsichtbar einen Verweis auf das äußere Car-Objekt hinzu, sodass Methoden der inneren Door-Klasse verwendet werden kann auf die Variablen der äußeren Car-Klasse zugreifen und deren Methoden aufrufen.“

„Verschachtelte Objekte. Macht für mich Sinn. Dem Diagramm nach zu urteilen, ist alles ziemlich einfach.“

„Und so ist es. Bis auf ein paar Nuancen.“

„Die innere Door-Klasse hat einen Verweis auf das Car-Objekt, daher:“

1) Sie können kein Door-Objekt innerhalb einer statischen Methode der Car-Klasse erstellen, da statische Methoden keinen Verweis auf das Car-Objekt enthalten, der implizit an den Door-Konstruktor übergeben wird.

Richtig Falsch
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) Die Door-Klasse darf keine statischen Variablen oder Methoden enthalten.

Richtig Falsch
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;
  }
 }
}

„Und was ist, wenn ich eine Variable benötige, die von allen Door-Objekten gemeinsam genutzt wird?“

„Sie können es jederzeit einfach in der Car-Klasse deklarieren. Dann wird es von allen Door-Objekten, die in einem Car-Objekt verschachtelt sind, gemeinsam genutzt.“

3) Hinweis: Wenn die innere Klasse als öffentlich deklariert ist, können Instanzen davon außerhalb der äußeren Klasse erstellt werden, aber zuerst muss eine Instanz der äußeren Klasse existieren:

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

4) Und noch ein Kommentar, den ich fast vergessen hätte.

„Da wir zwei verschachtelte Objekte haben, haben die Methoden des inneren Objekts Zugriff auf zwei Referenzen namens ‚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);
 }
}

„Ich habe in den Klassen bewusst Variablen mit demselben Namen deklariert.“

„Um auf eine Variable aus der äußeren Klasse zuzugreifen, wenn sie ausgeblendet ist, oder um auf ‚this‘ innerhalb einer inneren Klasse zuzugreifen, schreiben Sie einfach ‚YourClassName.this‘:“

So greifen Sie auf das „This“ einer äußeren (oder einer anderen) Klasse zu
Car.this
Car.Door.this
Car.Door.InnerClass2.InnerClass3.this

„Wenn wir also ‚this‘ in die Methode einer inneren Klasse schreiben, bezieht sich ‚this‘ dann auf die innere Klasse?“

"Ja genau."

„Was hältst du von inneren Klassen, Amigo?“

„Sie sind sehr interessant. Ich würde nicht sagen, dass sie zu schwierig sind.“

„Es gibt viele Einschränkungen, aber sie erscheinen ziemlich logisch, nachdem Sie erklärt haben, woher diese Einschränkungen kommen und warum sie existieren.“

„Außerdem schreibe ich seit zwei Monaten verschachtelte Klassen in Aufgaben, aber erst jetzt wird mir klar, was ich wirklich geschrieben habe.“

„Danke für die tolle Lektion, Ellie.“

„Ich freue mich, dass es dir gefallen hat, Amigo.“