Statikus beágyazott osztályok – 1

"Tehát a második téma a statikus beágyazott osztályok. Ne feledje, hogy a nem statikus beágyazott osztályokat belső osztályoknak nevezik .

"Tekerjük a fejünket, mit jelent a statikus szó egy beágyazott osztálydeklaráció kontextusában. Mit gondolsz?"

"Ha egy változó statikusnak van deklarálva, akkor a változónak csak egy példánya létezik. Tehát, ha egy beágyazott osztály statikus, akkor ez azt jelenti, hogy ebből az osztályból csak egy objektumot hozhat létre?"

"Ne hagyd, hogy a statikus szó megzavarjon. Igaz, hogy ha egy változót statikusnak deklarálunk, akkor a változónak csak egy példánya van. De a statikus beágyazott osztály ebből a szempontból inkább egy statikus metódus. A static szó az osztálydeklaráció előtt azt jelzi, hogy az osztály nem tárol hivatkozásokat a külső osztályának objektumaira."

"Ah. A normál metódusok implicit módon tárolnak egy objektumhivatkozást, de a statikus módszerek nem. Ugyanez a helyzet a statikus osztályokkal, igazam van, Ellie?"

"Abszolút. Dicséretes a gyors megértése. A statikus beágyazott osztályok nem tartalmaznak rejtett hivatkozásokat a külső osztályuk objektumaira."

class Zoo
{
 private static int count = 7;
 private int mouseCount = 1;

 public static int getAnimalCount()
 {
  return count;
 }

 public int getMouseCount()
 {
  return mouseCount;
 }

 public static class Mouse
 {
  public Mouse()
  {
  }
   public int getTotalCount()
  {
   return count + mouseCount; // Compilation error.
  }
 }
}

– Nézzük át alaposan ezt a példát!

"Milyen változókhoz férhet hozzá a statikus getAnimalCount metódus?"

"Csak a statikusak. Mert ez egy statikus módszer."

"Milyen változókhoz férhet hozzá a getMouseCount metódus?"

"Mind a statikus, mind a nem statikus. Van egy rejtett hivatkozása (ez) egy állatkerti objektumra."

"Így van. Tehát a statikus beágyazott Mouse osztály, mint egy statikus metódus, hozzáférhet a Zoo osztály statikus változóihoz, de nem fér hozzá a nem statikusokhoz."

"Biztonságosan létrehozhatunk egérobjektumokat, még akkor is, ha egyetlen állatkerti objektumot sem hoztak létre. Ezt a következőképpen teheti meg:"

class Home
{
 public static void main(String[] args)
 {
  Zoo.Mouse mouse = new Zoo.Mouse();
 }
}

"A Mouse osztály valójában egy nagyon hétköznapi osztály. Az a tény, hogy az Állatkert osztályon belül van deklarálva, két különleges tulajdonságot ad neki."

1) A külső osztályon kívüli beágyazott osztály (például az egér osztály) objektumainak létrehozásakor a pont operátort is kell használnia a külső osztály nevének megadásához.

– Például így: Állatkert.Egér.

2) A Zoo.Mouse osztály és objektumai hozzáférnek a Zoo osztály privát statikus változóihoz és metódusaihoz (mivel a Mouse osztály a Zoo osztályon belül is deklarált).

– Mára ennyi.

– Szóval csak egy további név, és ennyi?

"Igen."

– Ez még könnyebb, mint elsőre tűnt.