CodeGym /Java blog /Véletlen /Statikus beágyazott osztályok
John Squirrels
Szint
San Francisco

Statikus beágyazott osztályok

Megjelent a csoportban
Szia! Folytatjuk a Java beágyazott osztályok témakörének feltárását. Az utolsó gyakorlatban a nem statikus beágyazott osztályokról beszéltünk, amelyeket belső osztályoknak is neveznek. Statikus beágyazott osztályok – 1Ma áttérünk egy másik osztálycsoportra. Figyelembe vesszük a statikus beágyazott osztályokat. Statikus beágyazott osztályok – 3Miben különböznek a többi osztálytól? Az ilyen típusú osztályok deklarálásakor a static kulcsszót használjuk, amelyet már ismer:

public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {
      
       public static int getMaxPassengersCount() {
          
           return maxPassengersCount;
       }
   }
}
Statikus beágyazott osztályok – 4Ebben a példában van a Boeing737külső osztály, amely egy ilyen típusú repülőgépet reprezentál. Konstruktora van egy paraméterrel: a gyártás éve ( int manufactureYear). Van egy statikus változó is: az utasok maximális száma ( int maxPassengersCount). Ugyanannak a modellnek minden síkjára ugyanaz lesz az értéke, így csak egy példányra van szükségünk. Ezenkívül van egy statikus beágyazott osztálya: Drawing(a repülőgép mérnöki tervrajzait reprezentálja). Ezt az osztályt használjuk a repülőgéppel kapcsolatos összes hivatalos információ beágyazására. Példánkban az egyszerűség kedvéért ezt az osztályt a gyártás évére korlátoztuk, de sok egyéb információt is tartalmazhat. Statikus beágyazott osztályok – 5Ahogy az előző leckében is mondtuk, egy ilyen beágyazott osztály létrehozása javítja a beágyazást és hozzájárul a valósághűbb absztrakcióhoz. Mi a különbség a statikus és a nem statikus beágyazott osztályok között? 1. A statikus osztály objektumai Drawingnem tárolnak hivatkozást a külső osztály egy adott példányára. Emlékezzen a kerékpáros példára az előző leckéből:

public class Bicycle {

   private String model;
   private int maxWeight;

   public Bicycle(String model, int maxWeight) {
       this.model = model;
       this.maxWeight = maxWeight;
   }
  
   public void start() {
       System.out.println("Let's go!");
   }

   public class Handlebar {

       public void right() {
           System.out.println("Steer right!");
       }

       public void left() {

           System.out.println("Steer left!");
       }
   }

}
Abban a leckében arról beszéltünk, hogy a Handlebarbelső osztály minden példánya, számunkra észrevétlenül, átad egy hivatkozást a külső osztály példányára Bicycle. A külső osztály egy példánya nélkül a belső osztály objektuma egyszerűen nem létezhetne. A statikus beágyazott osztályok esetében ez nem így van. Egy statikus beágyazott osztály objektuma teljes mértékben képes önállóan létezni. Ebben a tekintetben a statikus osztályok inkább „függetlenek”, mint a nem statikusak. Az egyetlen dolog, amit tudnia kell, hogy egy ilyen objektum létrehozásakor meg kell adnia a külső osztály nevét:

public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
Miért tettük Drawingstatikussá az osztályt, amikor az utolsó leckében aSeatosztály (a kerékpárülést ábrázolja) nem statikus? Mint legutóbb, tegyünk hozzá egy kis "filozófiát" a példa megértése érdekében :) A kerékpárüléssel ellentétben a műszaki rajz fogalma nem kötődik mereven a repülőgép fogalmához. Bicikli nélkül egy külön kerékpárülés tárgy legtöbbször értelmetlen lenne (bár nem mindig, erről beszéltünk az utolsó órán). A műszaki rajz fogalma önmagában is értelmes. Például hasznos lehet a repülőgép-karbantartást tervező mérnökök számára. A repülőgépre nincs szükség a terv elkészítéséhez, bárhol elhelyezhető. Csak a műszaki rajzra van szükség. Ezen kívül minden azonos típusú repülőgépen ugyanaz a mérnöki rajz lesz, így nincs olyan szoros kapcsolat, mint a kerékpárülésnél. Ezért aDrawingaz objektumnak nincs szüksége egy adott repülőgép-objektumra való hivatkozásra. 2. Eltérő hozzáférés a külső osztály változóihoz és metódusaihoz. Egy statikus beágyazott osztály csak egy külső osztály statikus mezőihez férhet hozzá. Példánkban az Drawingosztálynak van egy metódusa, amely a külső osztály getMaxPassengersCount()statikus változójának értékét adja vissza . maxPassengersCountNem tudunk azonban olyan getManufactureYear()metódust létrehozni az osztályban, Drawingamely az értékét visszaadja manufactureYear. Végül is a manufactureYearváltozó nem statikus, ami azt jelenti, hogy egy adott példányához kell tartoznia Boeing737. És amint azt már felfedeztük, a statikus beágyazott osztályok esetében könnyen előfordulhat, hogy a külső osztály objektuma hiányzik. Innen a korlátozás :) Nem számít, hogy egy statikus változónak melyik hozzáférési módosítója van a külső osztályban. Még ha az isprivate, a statikus beágyazott osztály továbbra is hozzáférhet. A fentiek mindegyike nemcsak a statikus változókhoz való hozzáférésre vonatkozik, hanem a statikus módszerekre is. FONTOS! Egy belső osztály deklarációjában a statickulcsszó nem azt jelenti, hogy csak egy objektumot hozhat létre. Ne keverje össze az objektumokat a változókkal. Ha statikus változókról beszélünk, akkor igen, létezik egy statikus osztályváltozó egyetlen példánya, például maxPassangersCount. De ha staticegy beágyazott osztályra alkalmazzák, az csak azt jelenti, hogy az objektumai nem tartalmaznak hivatkozásokat a külső osztály objektumaira. És tetszőleges számú objektumot létrehozhatunk:

public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       private int id;

       public Drawing(int id) {
           this.id = id;
       }

       public static int getPassengersCount() {

           return maxPassengersCount;
       }

       @Override
       public String toString() {
           return "Drawing{" +
                   "id=" + id +
                   '}';
       }

       public static void main(String[] args) {

           for (int i = 1; i < 6; i++) {

               Boeing737.Drawing drawing = new Boeing737.Drawing(i);
               System.out.println(drawing);
           }
       }
   }
}
Közvetlenül a beágyazott osztályban deklaráltuk a main()metódust (ennek nincs különösebb oka – csak azért, hogy tudatjuk, hogy ez lehetséges), és létrehoztunk 5 Drawingobjektumot. Annak ellenére, hogy a külső osztályból egyetlen tárgyunk sincs. Mint látható, ez nem okozott semmilyen problémát :) Konzol kimenet:

Drawing{id=1} 
Drawing{id=2} 
Drawing{id=3} 
Drawing{id=4} 
Drawing{id=5}
És ezzel véget is ért a leckénk! Minden esetre meghagyok egy linket az Oracle dokumentáció róluk szóló részéhez . Ha valami még mindig nem világos, olvassa el. Most itt az ideje, hogy megoldjak pár feladatot! :)
Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION