– Szia Amigo!

– Szia, Ellie!

"Ma egy nagyon érdekes témánk van. Ma a beágyazott osztályokról fogok mesélni."

"Ha egy osztályt egy másik osztályon belül deklarálnak, akkor az egy beágyazott osztály. A nem statikus beágyazott osztályokat belső osztályoknak nevezzük."

"A belső osztály objektumai a külső osztály objektumaiba vannak beágyazva, és ezért hozzáférhetnek a külső osztály változóihoz."

Példa
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);
  }
 }
}

"Ne feledje, hogy az Ajtó osztály rendelkezik egy getDoorHeight metódussal. Az Autó objektum magassági változóját használja, és visszaadja az ajtó magasságát."

Beágyazott osztályok – 1

"A Door objektum nem létezhet egy Car objektumtól függetlenül. Végül is a Car objektum változóit használja. A fordító láthatatlanul hozzáad a konstruktorhoz és a Door osztályhoz egy hivatkozást a külső Car objektumra, így a belső Door osztály metódusai hozzáférhet a külső Car osztály változóihoz, és meghívhatja metódusait."

"Beágyazott objektumok. Számomra logikus. A diagramból ítélve az egész nagyon egyszerű."

– És ez így van. Néhány árnyalattól eltekintve.

"A belső ajtó osztály az Autó objektumra hivatkozik, ezért:"

1) Nem hozhat létre Ajtó objektumot a Car osztály statikus metódusán belül, mert a statikus metódusok nem tartalmaznak hivatkozást a Car objektumra, amely implicit módon átadásra kerül a Door konstruktornak.

Helyes Helytelen
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) A Door osztály nem tartalmazhat statikus változókat vagy metódusokat.

Helyes Helytelen
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;
  }
 }
}

"És mi van, ha szükségem van egy olyan változóra, amelyet minden Door objektum megoszt?"

"Mindig egyszerűen deklarálhatja az Autó osztályban. Ezután megosztja az összes Autó objektumba ágyazott ajtóobjektum."

3) Megjegyzés: ha a belső osztály nyilvánosnak van deklarálva, akkor annak példányai a külső osztályon kívül is létrehozhatók, de először a külső osztály példányának kell léteznie:

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

4) És még egy megjegyzés, amit majdnem elfelejtettem.

"Mivel két beágyazott objektumunk van, a belső objektum metódusai két "this" nevű hivatkozáshoz férnek hozzá:"

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

"Szándékosan deklaráltam az osztályokban azonos nevű változókat."

"Ha hozzá szeretne férni egy változóhoz a külső osztályból, ha az el van rejtve, vagy a "this"-hez egy belső osztályon belül szeretne hozzáférni, egyszerűen írja be a "YourClassName.this" parancsot:"

Hogyan lehet elérni egy külső (vagy bármely más) osztály „ezt”.
Car.this
Car.Door.this
Car.Door.InnerClass2.InnerClass3.this

"Szóval, ha egy belső osztály metódusába írjuk a "this" kifejezést, akkor a "this" a belső osztályra vonatkozik?"

"Igen, pontosan."

– Mi a véleményed a belső osztályokról, Amigo?

"Nagyon érdekesek. Nem mondanám, hogy túl nehézek."

"Sok korlátozás van, de ezek egészen logikusnak tűnnek, miután elmagyarázta, honnan származnak ezek a korlátozások, és miért léteznek."

– Ráadásul két hónapja írok beágyazott osztályokat a feladatokba, de csak most jövök rá, mit is írtam valójában.

– Köszönöm a nagyszerű leckét, Ellie.

– Örülök, hogy tetszett, Amigo.