class OuterClass {
class InnerClass {
static int i = 100; // compile error
static void f() { } // compile error
}
}
Obwohl es nicht möglich ist, mit auf das statische Feld OuterClass.InnerClass.i
zuzugreifen, wäre es hilfreich, dieses Feld statisch zu machen, wenn ich etwas aufzeichnen möchte, das statisch sein sollte, z. B. die Anzahl der erstellten InnerClass-Objekte. Also warum nicht Java verbieten statische Felder / Methoden in inneren Klassen?
BEARBEITEN: Ich weiß, wie man den Compiler mit statisch verschachtelter Klasse (oder statischer innerer Klasse) glücklich macht, aber ich möchte wissen, warum Java statische Felder / Methoden innerhalb innerer Klassen (oder gewöhnlicher innerer Klasse) sowohl vom Sprachdesign als auch vom Sprachdesign verbietet Implementierungsaspekte, wenn jemand mehr darüber weiß.
java
inner-classes
static-members
Jichao
quelle
quelle
Antworten:
Die Idee hinter inneren Klassen besteht darin, im Kontext der einschließenden Instanz zu arbeiten. Irgendwie widerspricht das Zulassen statischer Variablen und Methoden dieser Motivation?
quelle
Weil diese inneren Klassen innere "Instanz" -Klassen sind. Das heißt, sie sind wie ein Instanzattribut des umschließenden Objekts.
Da es sich um "Instanz" -Klassen handelt, ist es nicht sinnvoll,
static
Funktionen zuzulassen , dastatic
diese zunächst ohne Instanz funktionieren sollen.Es ist, als würden Sie gleichzeitig versuchen, ein statisches / Instanzattribut zu erstellen.
Nehmen Sie das folgende Beispiel:
Wenn Sie zwei Instanzen von Mitarbeitern erstellen:
Es ist klar, warum jeder seinen eigenen Wert für die Immobilie hat
name
, oder?Das gleiche passiert mit der inneren Klasse; Jede innere Klasseninstanz ist unabhängig von der anderen inneren Klasseninstanz.
Wenn Sie also versuchen, ein
counter
Klassenattribut zu erstellen , können Sie diesen Wert nicht auf zwei verschiedene Instanzen verteilen.Was wäre beim Erstellen der Instanz
a
undb
im obigen Beispiel ein korrekter Wert für die statische Variablecount
? Es ist nicht möglich, es zu bestimmen, weil die Existenz derInnerData
Klasse vollständig von jedem der umschließenden Objekte abhängt.Deshalb
static
braucht die Klasse, wenn sie als deklariert wird , keine lebende Instanz mehr, um sich selbst zu leben. Da keine Abhängigkeit mehr besteht, können Sie ein statisches Attribut frei deklarieren.Ich denke, das klingt wiederholt, aber wenn Sie über die Unterschiede zwischen Instanz- und Klassenattributen nachdenken, ist dies sinnvoll.
quelle
final
sind statische Felder in der inneren Klasse in Java zulässig. Wie erklären Sie dieses Szenario?InnerClass
kann keinestatic
Mitglieder haben, da es zu einer Instanz (vonOuterClass
) gehört. Wenn Sie erklären ,InnerClass
wiestatic
es von der Instanz zu lösen, wird Ihr Code kompilieren.Übrigens: Sie können weiterhin Instanzen von erstellen
InnerClass
.static
in diesem Zusammenhang erlaubt dies, dass ohne eine einschließende Instanz vonOuterClass
.quelle
InnerClass
gehört nicht dazuOuterClass
, Instanzen davon tun. Die beiden Klassen selbst haben keine solche Beziehung. Die Frage, warum Sie keine statischen Methoden verwenden können,InnerClass
bleibt bestehen.Tatsächlich können Sie statische Felder deklarieren, wenn sie Konstanten sind und in Kompilierungszeit geschrieben werden.
quelle
Da innere Klassen von der Instanz der einschließenden / äußeren Klasse abhängig sind, muss die äußere Klasse vor der Initialisierung der inneren Klasse initialisiert werden.
Dies sagt JLS über die Klasseninitialisierung. Der Punkt, den wir brauchen, ist, dass Klasse T initialisiert wird, wenn
Wenn also auf die innere Klasse ein statisches Feld zugegriffen wird, wird die innere Klasse initialisiert, dies stellt jedoch nicht sicher, dass die einschließende Klasse initialisiert wird.
Es würde einige Grundregeln verletzen . Sie können zum letzten Abschnitt (zu
two cases
) springen, um Noob-Sachen zu vermeidenEine Sache , wenn einige sind
static nested
class
nested class
static
wird es sich verhalten wie eine normale Klasse in jeder Hinsicht , und es wird mit der Außenklasse zugeordnet.Aber das Konzept von
Inner class
/ ist es wird mit dem der äußeren / einschließenden Klasse assoziiert . Bitte beachten Sie, dass die Instanz nicht der Klasse zugeordnet ist. Die Zuordnung zur Instanz bedeutet nun eindeutig, dass sie ( nach dem Konzept der Instanzvariablen ) innerhalb einer Instanz vorhanden ist und sich zwischen den Instanzen unterscheidet.non-static
nested class
instance
Wenn wir nun etwas statisch machen, erwarten wir, dass es beim Laden der Klasse initialisiert wird und von allen Instanzen gemeinsam genutzt werden sollte. Aber um nicht statisch zu sein, werden selbst innere Klassen ( Sie können die Instanz der inneren Klasse vorerst definitiv vergessen ) nicht mit allen Instanzen der äußeren / umschließenden Klasse geteilt ( zumindest konzeptionell ). Wie können wir dann diese Variable erwarten? der inneren Klasse wird unter allen Instanzen der inneren Klasse geteilt.
Wenn Java es uns erlaubt, statische Variablen in nicht statisch verschachtelten Klassen zu verwenden. Es wird zwei Fälle geben .
context of instance
(Instanzvariable). Dann ist es ein NEIN.quelle
Hier ist die Motivation, die ich für diese "Grenze" am besten geeignet finde: Sie können das Verhalten eines statischen Feldes einer inneren Klasse als Instanzfeld des äußeren Objekts implementieren; Sie benötigen also keine statischen Felder / Methoden . Das Verhalten, das ich meine, ist, dass alle Instanzen der inneren Klasse eines Objekts ein Feld (oder eine Methode) gemeinsam haben.
Angenommen, Sie möchten alle Instanzen der inneren Klasse zählen, dann würden Sie Folgendes tun:
quelle
final
?Mit einfachen Worten, nicht statische innere Klassen sind Instanzvariablen für die äußere Klasse und werden nur erstellt, wenn eine äußere Klasse und ein äußeres Klassenobjekt zur Laufzeit erstellt werden, während statische Variablen zum Laden der Klasse erstellt werden. Nicht statische innere Klasse ist also Laufzeitsache, deshalb ist statisch nicht der Teil einer nicht statischen inneren Klasse.
HINWEIS: Behandeln Sie innere Klassen immer wie eine Variable für eine äußere Klasse. Sie können statisch oder nicht statisch sein wie alle anderen Variablen.
quelle
static final
Konstanten haben.Weil es Mehrdeutigkeiten im Sinne von "statisch" verursachen würde.
Entnommen aus "Core Java SE 9 für Ungeduldige" von Cay S. Horstmann. S. 90 Kapitel 2.6.3
quelle
Ich denke, es ist für die Konsistenz. Obwohl es keine technischen Einschränkungen zu geben scheint, können Sie von außen nicht auf statische Mitglieder der internen Klasse zugreifen, dh
OuterClass.InnerClass.i
weil der mittlere Schritt nicht statisch ist.quelle
static final
Konstanten haben.