"Ciao, Amico!"

"Ciao, Eli!"

"Oggi abbiamo un argomento molto interessante. Oggi vi parlerò delle classi nidificate."

"Se una classe è dichiarata all'interno di un'altra classe, allora è una classe annidata. Le classi annidate non statiche sono chiamate classi interne."

"Gli oggetti di una classe interna sono nidificati all'interno di oggetti della classe esterna e possono quindi accedere alle variabili della classe esterna."

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

"Notare che la classe Door ha un metodo getDoorHeight. Usa la variabile height dell'oggetto Car e restituisce l'altezza della porta."

Classi nidificate - 1

"Un oggetto Door non può esistere indipendentemente da un oggetto Car. Dopotutto, utilizza le variabili dell'oggetto Car. Il compilatore aggiunge invisibilmente al costruttore e alla classe Door un riferimento all'oggetto Car esterno, in modo che i metodi della classe Door interna può accedere alle variabili della classe Car esterna e chiamare i suoi metodi."

"Oggetti annidati. Per me ha senso. A giudicare dal diagramma, è tutto piuttosto semplice."

"E così è. A parte un paio di sfumature."

"La classe Door interna ha un riferimento all'oggetto Car, quindi:"

1) Non è possibile creare un oggetto Door all'interno di un metodo statico della classe Car, perché i metodi statici non contengono un riferimento all'oggetto Car che viene implicitamente passato al costruttore Door.

Corretto Errato
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) La classe Door non può contenere variabili o metodi statici.

Corretto Errato
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;
  }
 }
}

"E se avessi bisogno di una variabile condivisa da tutti gli oggetti Porta?"

"Puoi sempre semplicemente dichiararlo nella classe Car. Quindi sarà condiviso da tutti gli oggetti Door nidificati in un oggetto Car."

3) Nota: se la classe interna è dichiarata pubblica, le sue istanze possono essere create al di fuori della classe esterna, ma deve esistere prima un'istanza della classe esterna:

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

4) E un altro commento che ho quasi dimenticato.

"Poiché abbiamo due oggetti nidificati, i metodi dell'oggetto interno hanno accesso a due riferimenti chiamati '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);
 }
}

"Ho deliberatamente dichiarato variabili con lo stesso nome nelle classi."

"Per accedere a una variabile dalla classe esterna quando è nascosta, o per accedere a 'this' all'interno di una classe interna, scrivi semplicemente 'YourClassName.this':"

Come accedere a "questo" di una classe esterna (o qualsiasi altra).
Car.this
Car.Door.this
Car.Door.InnerClass2.InnerClass3.this

"Quindi, se scriviamo 'questo' all'interno del metodo di una classe interna, allora 'questo' si riferisce alla classe interna?"

"Si, esattamente."

"Cosa ne pensi delle classi interne, Amigo?"

"Sono molto interessanti. Non direi che sono troppo difficili."

"Ci sono molte restrizioni, ma sembrano abbastanza logiche dopo che hai spiegato da dove provengono quelle restrizioni e perché esistono."

"Inoltre, sono due mesi che scrivo classi nidificate in compiti, ma solo ora mi rendo conto di cosa ho scritto veramente."

"Grazie per l'ottima lezione, Ellie."

"Sono contento che ti sia piaciuto, Amigo."