"Hallo Amigo!"

"Hallo, Ellie!"

"Vandaag hebben we een heel interessant onderwerp. Vandaag ga ik je vertellen over geneste klassen."

"Als een klasse binnen een andere klasse wordt gedeclareerd, is het een geneste klasse. Niet-statische geneste klassen worden innerlijke klassen genoemd."

"Objecten van een binnenklasse zijn genest binnen objecten van de buitenklasse en hebben daarom toegang tot de variabelen van de buitenklasse."

Voorbeeld
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 op dat de Door-klasse een getDoorHeight-methode heeft. Deze gebruikt de hoogtevariabele van het Car-object en retourneert de hoogte van de deur."

Geneste klassen - 1

"Een Door-object kan niet onafhankelijk van een Car-object bestaan. Het gebruikt immers de variabelen van het Car-object. De compiler voegt onzichtbaar aan de constructor en aan de Door-klasse een verwijzing naar het buitenste Car-object toe, zodat methoden van de inner Door-klasse kan toegang krijgen tot de variabelen van de buitenste autoklasse en zijn methoden aanroepen."

"Geneste objecten. Klinkt logisch voor mij. Te oordelen naar het diagram is het allemaal vrij eenvoudig."

'En zo is het. Op een paar nuances na.'

"De klasse Inner Door verwijst naar het object Car, dus:"

1) U kunt geen Door-object maken binnen een statische methode van de Car-klasse, omdat statische methoden geen verwijzing naar het Car-object bevatten die impliciet wordt doorgegeven aan de Door-constructor.

Juist Niet correct
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) De klasse Door kan geen statische variabelen of methoden bevatten.

Juist Niet correct
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;
  }
 }
}

"En wat als ik een variabele nodig heb die door alle Door-objecten wordt gedeeld?"

"Je kunt het altijd gewoon declareren in de Car-klasse. Dan wordt het gedeeld door alle Door-objecten die zijn genest in een Car-object."

3) Opmerking: als de binnenste klasse openbaar is verklaard, kunnen er instanties van worden gemaakt buiten de buitenste klasse, maar er moet eerst een instantie van de buitenste klasse bestaan:

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

4) En nog een opmerking die ik bijna was vergeten.

"Aangezien we twee geneste objecten hebben, hebben de methoden van het binnenste object toegang tot twee referenties genaamd 'dit':"

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

"Ik heb opzettelijk variabelen met dezelfde naam in de klassen gedeclareerd."

"Om toegang te krijgen tot een variabele uit de buitenste klasse wanneer deze verborgen is, of om toegang te krijgen tot 'dit' binnen een binnenste klasse, schrijft u gewoon 'YourClassName.this':"

Hoe toegang te krijgen tot 'dit' van een buitenste (of een andere) klasse
Car.this
Car.Door.this
Car.Door.InnerClass2.InnerClass3.this

"Dus als we 'dit' in de methode van een binnenste klasse schrijven, verwijst 'dit' dan naar de binnenste klasse?"

"Ja precies."

"Wat vind jij van innerlijke lessen, Amigo?"

"Ze zijn erg interessant. Ik zou niet zeggen dat ze te moeilijk zijn."

"Er zijn veel beperkingen, maar ze lijken vrij logisch nadat je hebt uitgelegd waar die beperkingen vandaan komen en waarom ze bestaan."

"Bovendien schrijf ik al twee maanden geneste klassen in taken, maar nu pas realiseer ik me wat ik echt heb geschreven."

"Bedankt voor de geweldige les, Ellie."

'Ik ben blij dat je het leuk vond, Amigo.'