Looking for java Keywords? Try Ask4Keywords

Java LanguageVerschachtelte und innere Klassen


Einführung

Mit Java können Entwickler eine Klasse in einer anderen Klasse definieren. Eine solche Klasse wird als verschachtelte Klasse bezeichnet . Verschachtelte Klassen werden als Innere Klassen bezeichnet, wenn sie als nicht statisch deklariert wurden. Andernfalls werden sie einfach als statische verschachtelte Klassen bezeichnet. Diese Seite dient zum Dokumentieren und Bereitstellen von Details mit Beispielen zur Verwendung von geschachtelten und inneren Klassen von Java.

Syntax

  • public class OuterClass {public class InnerClass {}} // Innere Klassen können auch privat sein
  • public class OuterClass {public static class StaticNestedClass {}} // Statisch verschachtelte Klassen können auch privat sein
  • public void method () {private class LocalClass {}} // Lokale Klassen sind immer privat
  • SomeClass anonymousClassInstance = new SomeClass () {}; // Anonyme innere Klassen können nicht benannt werden, daher ist der Zugriff moot. Wenn 'SomeClass ()' abstrakt ist, muss der Rumpf alle abstrakten Methoden implementieren.
  • SomeInterface anonymousClassInstance = new SomeInterface () {}; // Der Body muss alle Schnittstellenmethoden implementieren.

Bemerkungen

Terminologie und Klassifizierung

Die Java Language Specification (JLS) klassifiziert die verschiedenen Arten von Java-Klassen wie folgt:

Eine Klasse der obersten Ebene ist eine Klasse, die keine verschachtelte Klasse ist.

Eine verschachtelte Klasse ist eine Klasse, deren Deklaration im Hauptteil einer anderen Klasse oder Schnittstelle auftritt.

Eine innere Klasse ist eine verschachtelte Klasse, die nicht explizit oder implizit als statisch deklariert ist.

Eine innere Klasse kann eine nicht statische Member-Klasse , eine lokale Klasse oder eine anonyme Klasse sein . Eine Member-Klasse eines Interfaces ist implizit statisch und wird daher niemals als innere Klasse betrachtet.

In der Praxis beziehen sich Programmierer auf eine Klasse der obersten Ebene, die eine innere Klasse als "äußere Klasse" enthält. Es besteht auch die Tendenz, "verschachtelte Klasse" zu verwenden, um nur auf (explizit oder implizit) statische verschachtelte Klassen zu verweisen.

Beachten Sie, dass zwischen anonymen inneren Klassen und den Lambdas eine enge Beziehung besteht, aber Lambdas sind Klassen.

Semantische Unterschiede

  • Top-Level-Klassen sind der "Basisfall". Sie sind für andere Teile eines Programms sichtbar, die normalen Sichtbarkeitsregeln unterliegen, die auf der Zugriffsmodifikationssemantik basieren. Wenn sie nicht abstrakt sind, können sie durch jeden Code instanziiert werden, bei dem die relevanten Konstruktoren basierend auf den Zugriffsmodifizierern sichtbar sind.

  • Statische verschachtelte Klassen folgen mit zwei Ausnahmen denselben Zugriffs- und Instantiierungsregeln wie Klassen der obersten Ebene:

    • Eine verschachtelte Klasse kann als private deklariert werden, sodass sie außerhalb der sie umgebenden Top-Level-Klasse nicht zugänglich ist.
    • Eine verschachtelte Klasse hat Zugriff auf die private Mitglieder der umgebenden Klasse der obersten Ebene und auf alle getesteten Klassen.

    Dies macht statische verschachtelte Klassen nützlich, wenn Sie mehrere "Entitätstypen" innerhalb einer engen Abstraktionsgrenze darstellen müssen. ZB wenn die verschachtelten Klassen zum Ausblenden von "Implementierungsdetails" verwendet werden.

  • Innere Klassen bieten die Möglichkeit, auf nicht statische Variablen zuzugreifen, die in umschließenden Bereichen deklariert sind:

    • Eine nicht statische Member-Klasse kann sich auf Instanzvariablen beziehen.
    • Eine lokale Klasse (in einer Methode deklariert) kann auch auf die lokalen Variablen der Methode verweisen, vorausgesetzt, sie sind final . (Für Java 8 und höher können sie effektiv final sein .)
    • Eine anonyme innere Klasse kann entweder innerhalb einer Klasse oder einer Methode deklariert werden und auf Variablen nach denselben Regeln zugreifen.

    Die Tatsache, dass eine Instanz der inneren Klasse auf Variablen in einer umgebenden Klasseninstanz verweisen kann, hat Auswirkungen auf die Instantiierung. Insbesondere muss eine einschließende Instanz implizit oder explizit bereitgestellt werden, wenn eine Instanz einer inneren Klasse erstellt wird.

Verschachtelte und innere Klassen Verwandte Beispiele