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. Heute wenden wir uns einer weiteren Gruppe von Klassen zu. Wir betrachten statisch verschachtelte Klassen. Wie 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;
}
}
}
In 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. Wie 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 Drawing
Klasse 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 Handlebar
inneren 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?Seat
Klasse (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 aDrawing
Das 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 Drawing
Klasse über eine getMaxPassengersCount()
Methode, die den Wert der statischen maxPassengersCount
Variablen 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 manufactureYear
ist 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 static
bedeutet 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 static
auf 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 Drawing
Objekte 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! :) :)
GO TO FULL VERSION