JavaRush /Java-Blog /Random-DE /Statisch verschachtelte Klassen

Statisch verschachtelte Klassen

Veröffentlicht in der Gruppe Random-DE
Hallo! Wir beschäftigen uns weiterhin mit dem Thema verschachtelter Klassen in Java. In der letzten Lektion haben wir über nicht statische verschachtelte Klassen oder, wie sie auch genannt werden, innere Klassen gesprochen. Statische verschachtelte Klassen – 2Heute gehen wir zu einer anderen Gruppe über und werfen einen genaueren Blick auf statische verschachtelte Klassen. Statische verschachtelte Klassen – 3Wie unterscheiden sie sich von anderen Gruppen? Bei der Deklaration einer solchen Klasse verwenden wir das bereits bekannte Schlüsselwort static:
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;
       }
   }
}
Statische verschachtelte Klassen – 4In diesem Beispiel haben wir eine externe Klasse Boeing737, die ein Flugzeug dieses Modells erstellt. Und er hat einen Konstruktor mit einem Parameter: dem Herstellungsjahr ( int manufactureYear). Es gibt auch eine statische Variable int maxPassengersCount– die maximale Passagierzahl. Es wird für alle Flugzeuge desselben Modells gleich sein, wir benötigen also nur ein Exemplar. Darüber hinaus verfügt es über eine statische innere Klasse Drawing– den Flugzeugentwurf. In dieser Klasse können wir alle Serviceinformationen zum Flugzeug zusammenfassen. In unserem Beispiel haben wir uns der Einfachheit halber auf das Herstellungsjahr beschränkt, es kann aber noch viele weitere Informationen enthalten. Statische verschachtelte Klassen – 5Wie wir in der letzten Vorlesung besprochen haben, erhöht die Erstellung einer solchen verschachtelten Klasse die Kapselung und fördert eine realistischere Abstraktion. Was ist der Unterschied zwischen statischen und nicht statischen verschachtelten Klassen? 1. Ein statisches Klassenobjekt Drawingspeichert keinen Verweis auf eine bestimmte Instanz der äußeren Klasse. Erinnern Sie sich an das Beispiel aus der letzten Vorlesung mit einem Fahrrad:
public class Bicycle {

   private String model;
   private int mawWeight;

   public Bicycle(String model, int mawWeight) {
       this.model = model;
       this.mawWeight = mawWeight;
   }

   public void start() {
       System.out.println("Gehen!");
   }

   public class SteeringWheel {

       public void right() {
           System.out.println(„Lenkrad nach rechts!“);
       }

       public void left() {

           System.out.println(„Lenkrad nach links!“);
       }
   }

}
Dort haben wir darüber gesprochen, wie SteeringWheeleine Referenz auf ein Objekt der äußeren Klasse (Fahrrad) an jede Instanz der inneren Klasse (Lenkrad) übergeben wird, ohne dass wir es merken Bicycle. Ohne ein Objekt der äußeren Klasse könnte ein Objekt der inneren Klasse einfach nicht existieren. Dies gilt nicht für statisch verschachtelte Klassen. Ein Objekt einer statisch verschachtelten Klasse kann problemlos für sich allein existieren. In dieser Hinsicht sind statische Klassen „unabhängiger“ als nicht statische Klassen. Der einzige Punkt ist, dass Sie beim Erstellen eines solchen Objekts den Namen der externen Klasse angeben müssen:
public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
Warum haben wir die Klasse Drawingstatisch gemacht, aber in der letzten Vorlesung Seatwar die Klasse (Fahrradsitz) nicht statisch? Fügen wir wie beim letzten Mal ein wenig „Philosophie“ hinzu, um das Beispiel zu verstehen :) Im Gegensatz zu einem Fahrradsitz ist die Essenz der Zeichnung nicht so eng mit der Essenz des Flugzeugs verbunden. Ein separates Sitzobjekt ohne Fahrrad ist meistens bedeutungslos (wenn auch nicht immer – darüber haben wir in der letzten Lektion gesprochen). Das Wesentliche der Zeichnung macht an sich schon Sinn. Beispielsweise kann es für Ingenieure nützlich sein, die Flugzeugreparaturen planen. Sie benötigen für die Planung nicht das Flugzeug selbst und können überall platziert werden – eine Zeichnung genügt. Darüber hinaus bleibt die Zeichnung für alle Flugzeuge desselben Modells gleich, sodass keine so starre Verbindung wie bei einem Sitz mit einem Fahrrad besteht. Daher Drawingbenötigt das Objekt keinen Link zu einem bestimmten Flugzeugobjekt. 2. Unterschiedlicher Zugriff auf Variablen und Methoden einer externen Klasse. Eine statisch verschachtelte Klasse kann nur auf statische Felder der äußeren Klasse zugreifen. In unserem Beispiel verfügt die Klasse Drawingüber eine Methode getMaxPassengersCount(), die den Wert einer statischen Variablen maxPassengersCountvon einer externen Klasse zurückgibt. Wir können jedoch keine Methode erstellen getManufactureYear(), um Drawingeinen Wert zurückzugeben manufactureYear. Schließlich manufactureYearist eine Variable nicht statisch, was bedeutet, dass sie zu einer bestimmten Instanz gehören muss Boeing737. Und wie wir bereits herausgefunden haben, kann es bei statisch verschachtelten Klassen leicht passieren, dass das Objekt der äußeren Klasse fehlt. Daher die Einschränkung :) Es spielt keine Rolle, welchen Zugriffsmodifikator die statische Variable in der äußeren Klasse hat. Selbst wenn dies der Fall ist private, besteht weiterhin Zugriff über eine statisch verschachtelte Klasse. Alle oben genannten Punkte betreffen nicht nur den Zugriff auf statische Variablen, sondern auch auf statische Methoden. WICHTIG! Das Wort staticin einer inneren Klassendeklaration bedeutet nicht, dass nur ein Objekt erstellt werden kann. Verwechseln Sie Objekte nicht mit Variablen. Wenn es sich um statische Variablen handelt, existiert beispielsweise eine statische Klassenvariable maxPassangersCountin einer einzigen Kopie. Bei einer Anwendung auf eine verschachtelte Klasse staticbedeutet dies jedoch lediglich, dass deren Objekte keine Verweise auf Objekte der äußeren Klasse enthalten. Und wir können so viele Objekte erstellen, wie wir möchten:
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);
           }
       }
   }
}
Wir haben die Methode main()direkt in der verschachtelten Klasse deklariert (es gibt keinen besonderen Grund dafür – nur damit Sie wissen, dass es möglich ist) und 5 Objekte erstellt Drawing. Trotz der Tatsache, dass wir kein einziges Objekt einer externen Klasse haben. Wie Sie sehen, gab es keine Probleme :) Konsolenausgabe:

Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
Damit ist unsere Lektion abgeschlossen! Für alle Fälle hinterlasse ich Ihnen einen Link zum Abschnitt darüber in der Oracle-Dokumentation . Lesen Sie es, wenn Sie unklare Punkte haben. Jetzt ist es an der Zeit, ein paar Probleme zu lösen! :) :)
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION