"Hej, Amigo!"

"Hej, Ellie!"

"I dag har vi et meget interessant emne. I dag vil jeg fortælle dig om indlejrede klasser."

"Hvis en klasse er erklæret inde i en anden klasse, så er det en indlejret klasse. Ikke-statiske indlejrede klasser kaldes indre klasser."

"Objekter af en indre klasse er indlejret inde i objekter af den ydre klasse og kan derfor få adgang til den ydre klasses variabler."

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

"Bemærk, at Door-klassen har en getDoorHeight-metode. Den bruger bilobjektets højdevariabel og returnerer dørens højde."

Indlejrede klasser - 1

"Et Door-objekt kan ikke eksistere uafhængigt af et Car-objekt. Det bruger trods alt Car-objektets variabler. Compileren tilføjer usynligt til konstruktøren og til Door-klassen en reference til det ydre Car-objekt, således at metoder i den indre Door-klasse kan få adgang til den ydre Car-klasses variabler og kalde dens metoder."

"Indlejrede objekter. Giver mening for mig. At dømme efter diagrammet er det hele ret ligetil."

"Og det er det også. Bortset fra et par nuancer."

"Den indre dør-klasse har en reference til bilobjektet, derfor:"

1) Du kan ikke oprette et Door-objekt inde i en statisk metode af Car-klassen, fordi statiske metoder ikke indeholder en reference til Car-objektet, der implicit videregives til Door-konstruktøren.

Korrekt Ukorrekt
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-klassen kan ikke indeholde statiske variabler eller metoder.

Korrekt Ukorrekt
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;
  }
 }
}

"Og hvad hvis jeg har brug for en variabel, der deles af alle Door-objekter?"

"Du kan altid blot deklarere det i Car-klassen. Så vil det blive delt af alle Door-objekter, der er indlejret i et Car-objekt."

3) Bemærk: hvis den indre klasse er erklæret som offentlig, kan forekomster af den oprettes uden for den ydre klasse, men en forekomst af den ydre klasse skal eksistere først:

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

4) Og en kommentar mere, som jeg næsten glemte.

"Da vi har to indlejrede objekter, har det indre objekts metoder adgang til to referencer kaldet 'dette':"

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

"Jeg erklærede bevidst variabler med samme navn i klasserne."

"For at få adgang til en variabel fra den ydre klasse, når den er skjult, eller for at få adgang til 'this' inde i en indre klasse, skal du blot skrive 'YourClassName.this':"

Sådan får du adgang til 'dette' af en ydre (eller enhver anden) klasse
Car.this
Car.Door.this
Car.Door.InnerClass2.InnerClass3.this

"Så hvis vi skriver 'dette' inde i en indre klasses metode, så refererer 'dette' til den indre klasse?"

"Ja præcis."

"Hvad synes du om indre klasser, Amigo?"

"De er meget interessante. Jeg vil ikke sige, at de er for svære."

"Der er mange restriktioner, men de virker ret logiske, efter du har forklaret, hvor disse restriktioner kommer fra, og hvorfor de eksisterer."

"Derudover har jeg skrevet indlejrede klasser i opgaver i to måneder, men først nu indser jeg, hvad jeg egentlig har skrevet."

"Tak for den gode lektion, Ellie."

"Jeg er glad for, at du kunne lide det, Amigo."