Java Innenklasse, ein ähnliches Konzept, findet sich auch in C ++, dh verschachtelte Klasse. Auf den ersten Blick mögen interne Klassen etwas überflüssig erscheinen, und ihre Nützlichkeit ist möglicherweise nicht so wichtig für Anfänger, aber mit einem detaillierten Verständnis davon werden Sie feststellen, dass Java-Designer in internen Klassen tatsächlich gut gemeint sind. Das Erlernen der Verwendung interner Klassen ist Teil der Mastering Advanced Java -Programmierung, mit der Sie Ihre Programmstruktur eleganter entwerfen können. Das Folgende wird aus den folgenden Aspekten eingeführt:
Erstes Treffen
public interface Inhalt {int value ();} public interface Ziel {String readLabel ();} öffentliche Klassengüter {private Klasse Inhalt implementiert Inhalt {private int i = 11; public int value () {return i; }} geschützte Klasse GDestination implementiert das Ziel {private String -Label; private Gdestination (String whireto) {label = whireto; } public String readLabel () {return label; }} public destination dest (string s) {return neue gdestination (s); } public contents content () {neue content zurückgeben (); }} class testgoods {public static void main (string [] args) {good p = new Goods (); Inhalt c = p.cont (); Ziel D = P.Dest ("Peking"); }}In diesem Beispiel sind der Klasseninhalt und die Gdestination in den Klassenwaren definiert und haben geschützte bzw. private Modifikatoren, um die Zugriffsebene zu steuern. Der Inhalt repräsentiert den Inhalt der Waren, während Gdestination das Ziel von Waren darstellt. Sie implementieren zwei Schnittstelleninhalte und Ziele. Verwenden Sie in der folgenden Hauptmethode den Inhalt C und Ziel D direkt, um zu arbeiten, und Sie sehen nicht einmal die Namen dieser beiden internen Klassen! Auf diese Weise spiegelt sich der erste Vorteil interner Klassen wider - versteckte Operationen, die andere nicht wissen sollen, das heißt, die Kapselung.
Gleichzeitig haben wir auch die erste Methode entdeckt, um Objekte für innere Klasse außerhalb des Umfangs der externen Klasse zu erhalten, dh die Methoden seiner externen Klasse zum Erstellen und Rückkehr zu verwenden. So tun die Methoden cont () und dest () im obigen Beispiel. Gibt es einen anderen Weg? Natürlich lautet das Syntaxformat wie folgt:
OUTERObject = New OuterClass (Konstruktorparameter); OUTERCLASS.INNERCASS InnerObject = OUTERObject.New Innerclass (Konstruktorparameter);
Beachten Sie, dass Sie beim Erstellen nicht statischer innerer Klassenobjekte zuerst die entsprechenden Objekte der äußeren Klassen erstellen müssen. Wie aus dem Grund führt es auch zu unserem nächsten Thema.
Nicht statische innere Klassenobjekte haben Verweise auf ihre äußeren Klassenobjekte
Eine kleine Änderung am Beispiel gerade jetzt:
Public Class Goods {privat Valuerate = 2; Inhalt des privaten Klassen implementiert Inhalte {private int i = 11*Valuerat; public int value () {return i; }} geschützte Klasse GDestination implementiert das Ziel {private String -Label; private Gdestination (String whireto) {label = whireto; } public String readLabel () {return label; }} public destination dest (string s) {return neue gdestination (s); } public contents content () {neue content zurückgeben (); }}Der modifizierte Teil wird rot angezeigt. Hier fügen wir der Warenklasse ein variables privates Variable -Wert hinzu, was den Wertkoeffizienten der Waren bedeutet. Multiplizieren Sie es, wenn der interne Klasseninhaltsmethodenwert () den Wert berechnet. Wir haben festgestellt, dass Value () auf ein Wert zugreifen kann, was auch der zweite Vorteil von inneren Klassen ist - ein inneres Klassenobjekt kann auf den Inhalt des externen Klassenobjekts zugreifen, das es erstellt hat, auch einschließlich privater Variablen! Dies ist eine sehr nützliche Funktion, die uns beim Entwerfen mehr Ideen und Verknüpfungen bietet. Um diese Funktion zu implementieren, muss das innere Klassenobjekt einen Hinweis auf das äußere Klassenobjekt haben. Wenn der Java -Compiler ein internes Klassenobjekt erstellt, übergibt er implizit den Hinweis auf sein externes Klassenobjekt und speichert es die ganze Zeit. Auf diese Weise können innere Klassenobjekte immer auf ihre externen Klassenobjekte zugreifen, weshalb das externe Klassenobjekt zuerst außerhalb des Umfangs externer Sammelaktionen erstellt werden muss.
Einige Leute mögen fragen, was ist, wenn eine Mitgliedsvariable in einer inneren Klasse eine Mitgliedervariable in einer äußeren Klasse entspricht, dh eine gleichnamige Mitgliedsvariable in der äußeren Klasse blockiert ist? Es ist in Ordnung, Java verwendet das folgende Format, um Verweise auf externe Klassen auszudrücken:
OUTERCLASS.THIS
Damit haben wir keine Angst vor solchen Blockierungssituationen.
Statische innere Klasse
Wie gewöhnliche Klassen können auch innere Klassen statisch sein. Im Vergleich zu nicht statischen inneren Klassen besteht der Unterschied darin, dass die statischen inneren Klassen keine Verweise auf die Außenseite haben. Dies ist den verschachtelten Klassen in C ++ sehr ähnlich. Der größte Unterschied zwischen Java -internen Klassen und C ++ verschachtelten Klassen besteht darin, ob es Verweise auf die Außenseite gibt. Natürlich gibt es einen Unterschied in der Perspektive des Designs und einige Details davon.
Darüber hinaus gibt es in einer nicht statischen inneren Klasse keine statischen Daten, statischen Methoden oder eine andere statische innere Klasse (die innere Klasse kann mehr als eine Schicht verschachtelt werden). Statische innere Klassen können das alles jedoch haben. Dies ist auch der zweite Unterschied zwischen den beiden.
Lokale interne Klassen
Ja, Java -interne Klassen können auch lokal sein und in einer Methode oder sogar in einem Codeblock definiert werden.
public class goods1 {public destination dest (string s) {class Gdestination implementiert Ziel {private String -Label; private Gdestination (String whireto) {label = whireto; } public String readLabel () {return label; }} Neue GDestination (s) zurückgeben; } public static void main (String [] args) {good1 g = new Goods1 (); Ziel D = G.Dest ("Peking"); }}Dies ist ein Beispiel oben. In der Methode Dest definieren wir eine innere Klasse, und schließlich gibt diese Methode das Objekt dieser inneren Klasse zurück. Dies kann geschehen, wenn wir nur eines seiner Objekte erstellen und es außen erstellen müssen, wenn wir eine innere Klasse verwenden. Natürlich können interne Klassen, die in Methoden definiert sind, Designs diversifizieren, und der Zweck ist nicht nur in diesem Sinne.
Hier ist ein bizarreres Beispiel:
public class good2 {private void internTracking (boolean b) {if (b) {class TrackingsLip {private String -ID; TrackingsLip (String s) {id = s; } String getLip () {return id; }} TrackingSlip ts = new TrackingsLip ("Slip"); String s = ts.getSlip (); }} public void track () {internTracking (true); } public static void main (String [] args) {good2 g = new Goods2 (); g.track (); }}Sie können kein Objekt dieser inneren Klasse außerhalb von if erstellen, da dies außerhalb des Rahmens liegt. Beim Kompilieren wird der innere Klassen -TrackingSLip jedoch gleichzeitig mit anderen Klassen zusammengestellt, ist jedoch ungültig, wenn er diesen Bereich aufgrund seines eigenen Umfangs überschreitet. Abgesehen davon unterscheidet es sich nicht von anderen inneren Klassen.
Anonyme interne Klasse
Die Syntax -Regeln der anonymen internen Klassen von Java sehen etwas seltsam aus, aber wie anonyme Arrays, wenn Sie nur ein Objekt einer Klasse erstellen müssen und ihren Namen nicht verwenden können, kann die Verwendung einer internen Klasse den Code präzise und klar aussehen lassen. Die Syntaxregeln sind wie folgt:
neuer interfacename () {......}; oder neuer SuperClassName () {......};Lassen Sie uns weiterhin ein Beispiel geben:
public class goods3 {public content content () {return New Contents () {private int i = 11; public int value () {return i; }}; }}Hier verwendet die Methode cont () eine anonyme innere Klasse, um ein Objekt direkt zurückzugeben, das die Klasse des Schnittstelleninhalts implementiert, das sehr präzise aussieht.
Im anonymen Adapter für die Ereignisverarbeitung in Java werden anonyme innere Klassen weit verbreitet. Wenn Sie beispielsweise das Fenster schließen möchten, fügen Sie diesen Code hinzu:
Frame.Addwindowlistener (neuer Fensteradapter () {public void windowsClosing (windowEvent e) {System.exit (0);}});Eine Sache, die zu beachten ist, dass die anonyme innere Klasse keinen Namen hat, kein Konstruktor hat (aber wenn diese anonyme innere Klasse eine übergeordnete Klasse erbt, die nur einen Konstruktor mit Argumenten enthält, müssen Sie diese Parameter beim Erstellen bringen und das Super -Keyword verwenden, um den entsprechenden Inhalt während des Implementierungsprozesses aufzurufen. Wenn Sie seine Mitgliedervariablen initialisieren möchten, gibt es verschiedene Möglichkeiten:
Wenn es sich um eine anonyme innere Klasse einer Methode handelt, können Sie diese Methode verwenden, um die gewünschten Parameter zu übergeben. Denken Sie jedoch daran, dass diese Parameter endgültig deklariert werden müssen.
Reform die anonyme innere Klasse in eine benannte lokale innere Klasse, damit sie einen Konstruktor haben kann.
Verwenden Sie Initialisierungscodeblöcke in dieser anonymen inneren Klasse.
Warum brauchen interne Klassen?
Was sind die Vorteile von Java -internen Klassen? Warum brauchen interne Klassen?
Lassen Sie uns zunächst ein einfaches Beispiel geben. Wenn Sie eine Schnittstelle implementieren möchten, eine Methode in dieser Schnittstelle jedoch denselben Namen und Parametern wie eine Methode in der von Ihnen vorgestellten Klasse hat, was sollten Sie dann tun? Zu diesem Zeitpunkt können Sie eine interne Klasse erstellen, um diese Schnittstelle zu implementieren. Da die innere Klasse für alle Inhalte der äußeren Klasse zugänglich ist, kann dies alle Funktionen erfüllen, die Sie diese Schnittstelle direkt implementieren.
Aber vielleicht müssen Sie sich fragen, ist es nicht genug, um die Methode zu ändern?
In der Tat ist es wirklich nicht überzeugend, dies als Grund für die Gestaltung interner Kategorien zu verwenden.
Der eigentliche Grund ist, dass die internen Klassen und Schnittstellen in Java kombiniert werden, um ein Problem zu lösen, über das von C ++ - Programmierern häufig beklagt wird - es gibt keine Vererbung mehr. In der Tat ist die Multi-Inheritanz von C ++ sehr kompliziert für das Design, und Java kann den Effekt der Multi-Inheritanz durch interne Klassen und Schnittstellen erzielen.
Java Internal Class Zusammenfassung
(1) Nicht statische innere Klasse zwischen den Methoden definiert:
● Periphere und interne Klassen können auf ihre eigenen privaten Mitglieder voneinander zugreifen.
● Statische Mitgliedsvariablen können in der inneren Klasse nicht definiert werden.
Aus dem Rahmen der externen Klasse, um ein internes Klassenobjekt zu erstellen, müssen Sie zunächst sein externes Klassenobjekt erstellen
(2) statische innere Klasse zwischen den Methoden definiert:
● Es können nur statische Mitglieder externer Klassen zugegriffen werden.
Die statische innere Klasse hat keine Hinweise auf die Außenseite
(3) in der Methode definierte lokale innere Klasse:
● Diese interne Klasse hat keine Berechtigungen zur Zugriffskontrolle
● Die periphere Klasse kann die lokale innere Klasse in der Methode nicht sehen, aber die lokale innere Klasse kann auf jedes Mitglied der peripheren Klasse zugreifen.
● In der Methode -Körperschaft können auf lokale interne Klassen zugegriffen werden. Die Zugriffserklärung muss jedoch nach der Definition der lokalen internen Klassen bestehen.
● lokale interne Klassen können nur auf Konstanten in der Methode -Körperschaft zugreifen, dh mit endgültigen Mitgliedern.
(4) Anonyme innere Klasse, die in der Methode definiert ist:
● Es gibt keinen Konstruktor, der stattdessen die Konstruktorparameter an den Superclass -Konstruktor weitergibt
Wenn Sie nur ein Objekt einer Klasse erstellen und ihren Namen nicht verwenden müssen, kann die Verwendung anonymer innerer Klassen den Code präzise und klar aussehen lassen.
Der obige Artikel versteht, dass interne und anonyme Klassen in Java umfassend sind, was der Inhalt ist, den ich mit Ihnen geteilt habe. Ich hoffe, es kann Ihnen eine Referenz geben und ich hoffe, Sie können Wulin.com mehr unterstützen.