Java interne Klassen
1. Bedeutung
In der Java -Programmiersprache werden Programme aus Klassen erstellt. Klassen können auch in einer Klasse deklariert werden, und wir nennen eine solche innere Klasse.
2. Funktion
• Um eine bessere Kapselung implementieren, wissen wir, dass Zugangsmodifikatoren für normale Klassen (Nicht-Inner-Klassen) nicht privat oder geschützt werden können, während innere Klassen dies können. Wenn wir die innere Klasse als privat erklären, kann nur die äußere Klasse auf die innere Klasse zugreifen und die innere Klasse gut verstecken.
• Innere Klassen können andere Klassen oder Schnittstellen erben oder implementieren (implementiert), ohne von externen Klassen beeinflusst zu werden.
• Innere Klassen können direkt auf Felder und Methoden externer Klassen zugreifen, auch wenn sie mit privatem geändert werden. Im Gegenteil, externe Klassen können nicht direkt auf Mitglieder interner Klassen zugreifen.
3. Prinzip
Interne Klassen sind ein Kompilierungszeitkonzept. Nach der Kompilierung werden wie folgt zwei unabhängige Klassendateien generiert:
öffentliche Klasse äußere {private String ouNname = "äußere"; Klasse Inner {private String innername = "inner"; }}Die kompilierte Datei lautet wie folgt:
Nach der Zusammenstellung wird Outer.inner in äußere $ Inner umbenannt, und der Zeitraum (.) Wird durch das Dollar -Schild ($) ersetzt.
Iv. Einstufung
Interne Java -interne Klassen können in interne Klassen, lokale interne Klassen, anonyme interne Klassen und statische interne Klassen unterteilt werden.
1) interne Klasse von Mitgliedern
Eine interne Mitgliedsklasse kann als Mitglied einer externen Klasse angesehen werden. Ein statisches Mitglied kann in einer internen Klasse nicht deklariert werden, aber das statische Endfeld ist eine Ausnahme. Wir wissen, dass wenn eine Klasse geladen ist, statische Mitglieder zuerst initialisiert werden. Wenn die interne Klasse des Mitglieds statische Mitglieder hat, wird die innere Klasse vor der externen Klasse generiert. Die innere Klasse dient der externen Klasse, und die innere Klasse, die vor der externen Klasse generiert wird, kann außer Kontrolle geraten. Bei der Instanziierung einer inneren Mitgliedsklasse wird die innere Klasse des Mitglieds einen Hinweis auf das aktuelle Objekt der externen Klasse verweisen, sodass Mitglieder der externen Klasse direkt in der inneren Mitgliederklasse zugegriffen werden können, selbst wenn private geändert wird.
statische Java.lang.System.out importieren; öffentliche Klasse äußere {private String ouNname = "äußere"; // Die externe Klasse kann nicht direkt auf Mitglieder der inneren Klasse zugreifen und muss das Objekt des inneren Klasse privat innere innere = new inner () instanziieren. öffentliche Klasse Inner {private String innername = "innere"; public void show () {out.println (outername); // Sie können direkt auf Mitglieder der äußeren Klasse zugreifen}} public void show () {out.println (inner.innername); Inner.show (); } public static void main (String [] args) {äußere outer = new outer (); ober.show (); // Die innere Klasse äußere.innner inner = äußere.New Inner (); Inner.show (); }}Auslaufergebnisse:
innere
äußere
äußere
Der Verweis auf das externe Klassenobjekt der internen Klasse der Mitgliedsklasse besteht aus dem Namen der externen Klasse zuvor. Diese Form wird genannt
Limited-This, Out.println (Outername) und Out.println (ober.this.outername) sind gleichwertig.
2) lokale interne Klassen
Die Verwendung lokaler innerer Klassen ist im Grunde genommen der gleiche wie der von Mitgliedern innerer Klassen. Es ist nur so, dass die lokalen inneren Klassen in den Methoden der externen Klasse definiert sind, genau wie lokale Variablen, und keine Mitglieder der externen Klasse sind. Eine lokale innere Klasse ist außerhalb der Methode unzugänglich, aber ihre Instanzen können aus der Methode zurückgegeben werden, und die Instanzen bleiben noch, bis sie nicht mehr verwiesen werden. Lokale interne Klassen können auch auf lokale Variablen, Methodenparameter usw. der Methode zugreifen, die sie sich befinden. Die Einschränkung besteht darin, dass lokale Variablen oder Methodenparameter nur zugegriffen werden können, wenn sie als endgültig deklariert werden.
statische Java.lang.System.out importieren; öffentliche Klasse äußere {private String ouNname = "äußere"; public void show (endgültige String str) {// Die Methodenparameter sind endgültige Typenklassen innere {public void print () {out.println (Outername+str); }} Innere innere = new Inner (); Inner.print (); } public static void main (String [] args) {äußere outer = new outer (); outer.show (": lalala"); }}Auslaufergebnisse:
Outer: Lalala
3) Anonyme interne Klasse
Sie können sich anonyme interne Klassen als lokale interne Klassen ohne Klassennamen vorstellen. Anonyme interne Klassen haben die folgenden Eigenschaften:
1. Anonyme interne Klassen können keine Konstruktoren haben. Anonyme interne Klassen haben keine Klassennamen, daher kann der Konstruktor nicht deklariert werden.
2. Anonyme interne Klassen müssen eine Schnittstelle erben oder implementieren. Der Typ, der neu zugeordnet ist, ist der Supertyp der anonymen Klasse. Anonyme Klassen können keine erweiterten oder implementierenden Klauseln angezeigt werden, noch können sie Modifikatoren haben.
3. Die anonymen internen Klassen entsprechen den internen Klassen der Mitglieder und lokalen internen Klassen, und statische Mitglieder können nicht deklariert werden.
statische Java.lang.System.out importieren; öffentliche Klasse äußere {private String ouNname = "äußere"; public void show (endgültige String str) {new Inner () {// Implementieren Sie die innere Schnittstelle public void print () {out.println (Outername+str); }} .print (); } public static void main (String [] args) {äußere outer = new outer (); outer.show (": lalala"); }} Schnittstelle Inner {void print (); }Auslaufergebnisse:
Outer: Lalala
4) Statische interne Klasse
Die statische innere Klasse, auch verschachtelte Klassen in einigen Büchern genannt, erfordert die Verwendung statischer Modifikatoren, wenn Sie sie deklarieren. Die statische innere Klasse unterscheidet sich von den ersten drei inneren Klassen. Die statische innere Klasse enthält keine Verweise auf das aktuelle Objekt der äußeren Klasse, sodass in der statischen inneren Klasse auf nicht statische Mitglieder der äußeren Klasse nicht zugegriffen werden können. Es kann gesagt werden, dass die statische innere Klasse nicht von der äußeren Klasse abhängt.
statische Java.lang.System.out importieren; öffentliche Klasse äußere {private String ouNname = "äußere"; private statische int id = 123; private innere innere = new innere (); öffentliche statische Klasse Inner {public void print1 () {//out.println(outername); Nicht statisches Mitglied der externen Klasse kann nicht zugegriffen werden. Println (ID); } public static void print2 () {out.println (id); }} public void show () {inner.print1 (); } public static void main (String [] args) {äußere outer = new outer (); ober.show (); Ober.inner.print2 (); // Zugriff auf die statische innere Klasse über den Klassennamen}} zugreifen}}