Über innere Klassen
Innere Klassen sind eine Art verschachtelter Klassen, und verschachtelte Klassen haben vier Typen: [ Quelle]
statische verschachtelte Klasse Eine statische verschachtelte Klasse, die gewöhnlichen Klassen ähnelt, hat keinen Verweis auf die externe Klasse und kann nur auf die statische ** der externen Klasse zugreifen nicht-statische Methode, wenn die innere Klasse statisch ist**, muss die Klasse statisch sein;
innere Klasse (nicht statisch), echte innere Klasse
lokale Klasse lokale Klasse (innerhalb der Methode definiert), echte interne Klasse
anonyme Klasse anonyme Klasse, echte interne Klasse, eher für die einmalige Verwendung geeignet und die implementierte Methode ist nicht mehrere Klassen
Eine echte innere Klasse kann direkt auf die Instanzvariablen und Methoden der äußeren gekapselten Klasse zugreifen [Quelle]
1. Eine innere Klasse und ihre äußere Klasse können auf die Eigenschaften und Methoden der jeweils anderen zugreifen (auch wenn sie privat sind) (JAVA8)
1) Vorher 8, anonyme innere Klassen verwendet Der Lebenszyklus lokaler Variablen stimmt nicht mit dem Lebenszyklus interner Klassenobjekte überein
2) Der Umfang der Mitgliedsvariablen interner Klassen bleibt innerhalb der Methode. Wenn die Methodenausführung endet Die lokale Variable verschwindet, aber der Verweis darauf kann intern vorhanden sein, aber wenn die interne Klasse erneut aufgerufen wird, greift sie auf eine nicht vorhandene Variable zu!
3), daher muss final vor jdk8 verwendet werden. Nach der Dekompilierung ist ersichtlich, dass die innere Klasse tatsächlich eine -Klasse mit einem Konstruktor generiert und die referenzierten Variablen als Parameter übergeben werden, einschließlich der externen Klasseninstanz (aus diesem Grund bleibt die interne Klasse erhalten). Die externe Klasse kann standardmäßig leicht zu Speicherverlusten führen und den Wert dann einer eigenen Variablen zuweisen. Das heißt, wenn der Wert der externen Variablen in der inneren Klasse geändert wird, ändert sich tatsächlich nur Der eigene Variablenwert ist nicht der Wert einer externen Variablen, sondern eine Änderung ihres Werts in der Methode. Die Variablen in der Methode sind alle lokal . Um das Auftreten dieser Inkonsistenz zu verhindern, muss sie endgültig sein. [Quelle]
4) und Java8 führt das Konzept der effektiven Endgültigkeit ein. Wenn eine innere Klasse auf eine externe Klassenvariable zugreift, ist dies die externe Klassenvariable, solange die innere Klasse die externe Variable nicht neu zuordnet Da es sich de facto um eine endgültige Variable handelt, deklariert Java implizit externe Variablen als endgültig. [Quelle]
5) Warum ist es endgültig? „Kopieren“ der endgültigen lokalen Variablen Wenn eine lokale innere Klasse als Datenelement einer lokalen inneren Klasse auf eine lokale Variable zugreift, wird tatsächlich auf eine „Kopie“ der lokalen Variablen zugegriffen. Wenn die echte lokale Variable im Ausführungsstapel stirbt , das innere Klassenobjekt kann immer noch auf die lokale Variable zugreifen ( (Es scheint, dass die Lebensdauer lokaler Variablen verlängert wurde). Bisher hat es nicht viel mit final zu tun. O(∩_∩)O haha~ Im Name von „final“, wir kehren schließlich zu final zurück. Die Variable ist final: [Quelle]
1. Referenztyp: Sein Referenzwert bleibt unverändert (zeigt immer auf dasselbe Objekt) und die Kopie ist das Gleiche wie die ursprüngliche Referenzvariable [Quelle]
2. Grundlegender Datentyp: Wenn eine Variable endgültig ist, ist ihre Kopie mit der ursprünglichen Größe identisch, da sich ihr Wert nicht ändert, und der semantische Effekt ist gleich das gleiche
[Quelle]
Spiegelt die logische Zugehörigkeit wider, und andere Klassen können die innere Klasse steuern Klasse soll für die Außenwelt unsichtbar sein
Der Geltungsbereich der Mitgliedsvariablen der externen Klasse ist die gesamte externe Klasse (einschließlich interner Klassen), aber die externe Klasse kann nicht auf die privaten Mitglieder der inneren Klasse zugreifen)
Nach der Kompilierung wird die innere Klasse in eine separate Klasse kompiliert. Die Form von outClass$innerClass ist
Statischer Initialisierungscontainer: Statischer Block: Ein statischer Block, der existiert außerhalb einer Klassenmethode und wird nur einmal ausgeführt, wenn die Klasse geladen wird. Sie wird häufig zum Initialisieren statischer Klassenattribute verwendet.
1. Statische Methoden können nicht durch nicht-statische Methoden überschrieben werden. 2. Konstruktoren dürfen nicht als statisch deklariert werden.
1. Kann nicht sein Von Basis- oder Quilt-Variablen überschriebene und markierte Variablen sind Konstanten
2. Weisen Sie zum Zeitpunkt der Deklaration einen Wert zu. Wenn nicht, gibt es nur eine Möglichkeit, einen Wert zuzuweisen, und Sie können nur einen Wert explizit zuweisen in der Konstruktormethode
Verwenden Sie unter normalen Umständen keine Anweisungen wie „return“ oder „throw“ im „final“-Block, die zum Beenden der Methode führen. Andernfalls sind die „return“- und „throw“-Anweisungen in Der Try-Block und der Catch-Block werden ungültig. Die Return-Anweisung im Final-Block führt zum Verlust der Ausnahme. 【Quelle】【Quelle】
Wenn in try...catch mehrere Catches vorhanden sind, sollte die Ausnahme der übergeordneten Klasse unter der Ausnahme der untergeordneten Klasse platziert werden, da sonst die Kompilierung fehlschlägt. Ich bin nicht zu faul, dies zu testen. ^_^
Warum werden interne Klassen und Ausnahmen oft zusammengeschrieben? Neungliedrige Kette. Aber machen Sie sich keine Sorgen über den nächsten Schritt.
Verwandte Artikel:
Detaillierte Erläuterung der grundlegenden internen Klassenbeispiele von Java.
Java Basic Interne Klasse Detaillierte Erläuterung des Beispielcodes
Verwandte Videos:
Das obige ist der detaillierte Inhalt von[Java-Grundlagen] Eine kurze Einführung in interne Klassen und ihre Eigenschaften. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!