"Hei, Amigo!"

"Hei, Ellie!"

"I dag har vi et veldig interessant emne. I dag skal jeg fortelle deg om nestede klasser."

"Hvis en klasse er deklarert inne i en annen klasse, er det en nestet klasse. Ikke-statiske nestede klasser kalles indre klasser."

"Objekter av en indre klasse er nestet inne i objekter av den ytre klassen og kan derfor få tilgang til den ytre klassens 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);
  }
 }
}

"Merk at Door-klassen har en getDoorHeight-metode. Den bruker bilobjektets høydevariabel og returnerer høyden på døren."

Nestede klasser - 1

"Et Door-objekt kan ikke eksistere uavhengig av et Car-objekt. Tross alt bruker det Car-objektets variabler. Kompilatoren legger usynlig til konstruktøren og til Door-klassen en referanse til det ytre Car-objektet, slik at metoder for den indre Door-klassen kan få tilgang til variablene til den ytre Car-klassen og kalle dens metoder."

"Nestede gjenstander. Det gir mening for meg. Etter diagrammet å dømme er det hele ganske enkelt."

"Og slik er det. Bortsett fra et par nyanser."

"Den indre dørklassen har en referanse til bilobjektet, derfor:"

1) Du kan ikke lage et Door-objekt i en statisk metode av Car-klassen, fordi statiske metoder ikke inneholder en referanse til Car-objektet som implisitt sendes til Door-konstruktøren.

Riktig stemmer ikke
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 inneholde statiske variabler eller metoder.

Riktig stemmer ikke
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 hva om jeg trenger en variabel som deles av alle Door-objekter?"

"Du kan alltid enkelt deklarere det i Car-klassen. Da vil det bli delt av alle Door-objekter som er nestet i et Car-objekt."

3) Merk: hvis den indre klassen er erklært som offentlig, kan forekomster av den opprettes utenfor den ytre klassen, men en forekomst av den ytre klassen må eksistere først:

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

4) Og en kommentar til som jeg nesten glemte.

"Siden vi har to nestede objekter, har metodene til det indre objektet tilgang til to referanser kalt '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ærte bevisst variabler med samme navn i klassene."

"For å få tilgang til en variabel fra den ytre klassen når den er skjult, eller for å få tilgang til 'dette' inne i en indre klasse, skriv ganske enkelt 'DittKlasseNavn.dette':"

Hvordan få tilgang til "dette" til en ytre (eller en annen) klasse
Car.this
Car.Door.this
Car.Door.InnerClass2.InnerClass3.this

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

"Ja nøyaktig."

"Hva synes du om indre klasser, Amigo?"

"De er veldig interessante. Jeg vil ikke si at de er for vanskelige."

"Det er mange restriksjoner, men de virker ganske logiske etter at du forklarte hvor disse restriksjonene kommer fra og hvorfor de eksisterer."

"I tillegg har jeg skrevet nestede klasser i oppgaver i to måneder, men først nå skjønner jeg hva jeg egentlig har skrevet."

"Takk for den gode leksjonen, Ellie."

"Jeg er glad du likte det, Amigo."