CodeGym/Java-Blog/Random-DE/Statisch verschachtelte Klassen
Autor
John Selawsky
Senior Java Developer and Tutor at LearningTree

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 Übung haben wir über nicht statische verschachtelte Klassen gesprochen, die auch als innere Klassen bezeichnet werden. Statische verschachtelte Klassen – 1Heute wenden wir uns einer weiteren Gruppe von Klassen zu. Wir betrachten statisch verschachtelte Klassen. Statische verschachtelte Klassen – 3Wie unterscheiden sie sich von anderen Klassen? Bei der Deklaration dieser Art von Klasse verwenden wir das Schlüsselwort static, mit dem Sie bereits vertraut sind:
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 die Boeing737äußere Klasse, die ein Flugzeug dieses Typs darstellt. Es verfügt über einen Konstruktor mit einem Parameter: dem Herstellungsjahr ( int manufactureYear). Es gibt auch eine statische Variable: die maximale Passagierzahl ( int maxPassengersCount). Es hat für alle Ebenen desselben Modells den gleichen Wert, sodass wir nur eine Instanz benötigen. Darüber hinaus verfügt es über eine statisch verschachtelte Klasse: Drawing(die die technischen Baupläne des Flugzeugs darstellt). Wir verwenden diese Klasse, um alle offiziellen Informationen über das Flugzeug zu kapseln. In unserem Beispiel haben wir der Einfachheit halber diese Klasse auf das Herstellungsjahr beschränkt, sie könnte jedoch viele andere Informationen enthalten. Statische verschachtelte Klassen – 5Wie wir in der letzten Lektion gesagt haben, verbessert die Erstellung einer solchen verschachtelten Klasse die Kapselung und trägt zu einer realistischeren Abstraktion bei. Was ist der Unterschied zwischen statischen und nicht statischen verschachtelten Klassen? 1. Ein Objekt der statischen DrawingKlasse speichert keinen Verweis auf eine bestimmte Instanz der äußeren Klasse. Erinnern Sie sich an das Fahrradbeispiel aus der letzten Lektion:
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!");
       }
   }

}
In dieser Lektion haben wir darüber gesprochen, dass jede Instanz der Handlebarinneren Klasse, für uns unmerklich, einen Verweis auf die Instanz der Bicycleäußeren Klasse übergibt. Ohne eine Instanz der äußeren Klasse könnte ein Objekt der inneren Klasse einfach nicht existieren. Bei statisch verschachtelten Klassen ist dies nicht der Fall. Ein Objekt einer statisch verschachtelten Klasse kann durchaus eigenständig existieren. In dieser Hinsicht sind statische Klassen „unabhängiger“ als nicht statische. Das Einzige, was Sie wissen müssen, ist, dass Sie beim Erstellen eines solchen Objekts den Namen der äußeren 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 statisch gemacht Drawing, als wir in der letzten Lektion das erstellt haben?SeatKlasse (die den Fahrradsitz darstellt) nicht statisch? Fügen wir wie beim letzten Mal ein wenig „Philosophie“ hinzu, um das Beispiel zu verstehen :) Anders als bei einem Fahrradsitz ist das Konzept einer Konstruktionszeichnung nicht starr an das Konzept eines Flugzeugs gebunden. Ohne ein Fahrrad wäre ein separater Fahrradsitz meist bedeutungslos (wenn auch nicht immer, darüber haben wir in der letzten Lektion gesprochen). Das Konzept einer technischen Zeichnung macht für sich genommen Sinn. Beispielsweise könnte es für Ingenieure nützlich sein, die die Wartung von Flugzeugen planen. Das Flugzeug wird für die Planung nicht benötigt und kann überall platziert werden. Es wird lediglich die technische Zeichnung benötigt. Darüber hinaus verfügen alle Flugzeuge desselben Modells über dieselbe Ingenieurzeichnung, sodass keine so enge Beziehung besteht wie bei einem Fahrradsitz. Daher aDrawingDas Objekt benötigt keinen Verweis auf ein bestimmtes Flugzeugobjekt. 2. Unterschiedlicher Zugriff auf die Variablen und Methoden der äußeren Klasse. Eine statisch verschachtelte Klasse kann nur auf die statischen Felder einer äußeren Klasse zugreifen. In unserem Beispiel verfügt die DrawingKlasse über eine getMaxPassengersCount()Methode, die den Wert der statischen maxPassengersCountVariablen der äußeren Klasse zurückgibt. getManufactureYear()Allerdings können wir in der Klasse keine Methode erstellen Drawing, um den Wert von zurückzugeben manufactureYear. Schließlich manufactureYearist die Variable nicht statisch, was bedeutet, dass sie zu einer bestimmten Instanz von gehören muss Boeing737. Und wie wir bereits festgestellt haben, kann es bei statisch verschachtelten Klassen leicht vorkommen, dass das Objekt der äußeren Klasse fehlt. Daher die Einschränkung :) Es spielt keine Rolle, welchen Zugriffsmodifikator eine statische Variable in der äußeren Klasse hat. Auch wenn es istprivate, hat eine statisch verschachtelte Klasse weiterhin Zugriff. All das gilt nicht nur für den Zugriff auf statische Variablen, sondern auch für statische Methoden. WICHTIG! Bei der Deklaration einer inneren Klasse staticbedeutet das Schlüsselwort nicht, dass Sie nur ein Objekt erstellen können. Verwechseln Sie Objekte nicht mit Variablen. Wenn wir über statische Variablen sprechen, dann gibt es ja eine einzelne Instanz einer statischen Klassenvariablen, zum Beispiel maxPassangersCount. Wenn es jedoch staticauf eine verschachtelte Klasse angewendet wird, bedeutet dies nur, dass deren Objekte keine Verweise auf Objekte der äußeren Klasse enthalten. Und wir können so viele Objekte selbst 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 main()Methode direkt in der verschachtelten Klasse deklariert (es gibt keinen besonderen Grund dafür – nur um Sie darüber zu informieren, dass dies möglich ist) und 5 DrawingObjekte erstellt. Trotz der Tatsache, dass wir kein einziges Objekt der äußeren Klasse haben. Wie Sie sehen, hat dies keine Probleme verursacht :) Konsolenausgabe:
Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
Und damit ist unsere Lektion abgeschlossen! Für alle Fälle hinterlasse ich Ihnen einen Link zum Abschnitt darüber in der Oracle-Dokumentation . Wenn noch etwas unklar bleibt, lesen Sie es. Jetzt ist es für mich an der Zeit, ein paar Aufgaben zu lösen! :) :)
Kommentare
  • Beliebt
  • Neu
  • Alt
Du musst angemeldet sein, um einen Kommentar schreiben zu können
Auf dieser Seite gibt es noch keine Kommentare