Heim > 类库下载 > java类库 > Hauptteil

Java-verschachtelte Klassen

高洛峰
Freigeben: 2016-11-05 16:31:23
Original
2460 Leute haben es durchsucht

Java ermöglicht die Definition einer Klasse innerhalb einer anderen Klasse, was als Klassenverschachtelung bezeichnet wird. Es gibt zwei Arten der Klassenverschachtelung: Statische werden als statisch verschachtelte Klassen bezeichnet, und nicht statische werden als innere Klassen bezeichnet.

Grund für die Verwendung verschachtelter Klassen:

Klassen sinnvoll kombinieren können, die nur an einer Stelle verwendet werden. Eine Klasse ist möglicherweise nur für eine andere Klasse nützlich. In diesem Fall kann die Kombination der ersteren mit der letzteren das Paket prägnanter machen.

Verbesserung der Kapselung. Wenn es zwei Klassen A und B gibt, muss Klasse B ein Mitglied der Klasse A verwenden, und dieses Mitglied ist zufällig nur innerhalb der Klasse sichtbar. Wenn B als verschachtelte Klasse von A definiert ist, kann B jedes Mitglied von verwenden A. und B können auch für äußerlich unsichtbar erklärt werden.

kann den Code lesbarer und wartbarer machen. Verschachtelter Klassencode liegt näher am Einsatzort als Klassen der obersten Ebene und ist daher einfacher anzuzeigen.

Verschachtelte Klassen sind ebenfalls Mitglieder einer Klasse, sodass Sie auch den sichtbaren Bereichskontrollmodifikator von Klassenmitgliedern verwenden können. Innere Klassen können andere Klassenmitglieder der Klasse verwenden, in der sie sich befinden, statische verschachtelte Klassen jedoch nicht Verwenden Sie sie von anderen Klassenmitgliedern.

Statisch verschachtelte Klasse

Ähnlich wie statische Methoden und statische Felder sind statisch verschachtelte Klassen mit der Klasse verknüpft, in der sie sich befinden. Statische verschachtelte Klassen können Instanzvariablen oder Instanzfelder nicht direkt verwenden, sondern können nur über ein Objekt referenziert werden. Statische verschachtelte Klassen können als dieselben wie andere Klassen der obersten Ebene betrachtet werden, sind jedoch zur Vereinfachung der Verpackung in andere Klassen eingebettet.

Die Verwendung statischer verschachtelter Klassen ähnelt der anderer Klassenmitglieder in der Klasse. Lassen Sie uns demonstrieren, wie statische verschachtelte Klassenobjekte erstellt werden:

//StaticNestedClass为OuterClass的一个嵌套类OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
Nach dem Login kopieren

Innere Klasse (nicht statische verschachtelte Klasse).

Eine innere Klasse ist mit der Instanz ihrer Klasse verknüpft und kann die Methoden und Felder des Instanzobjekts direkt verwenden. Die innere Klasse ist mit der Instanz verknüpft, sodass die innere Klasse keine statischen Mitglieder definieren kann.

Wenn Sie ein inneres Klassenobjekt erstellen müssen, müssen Sie zunächst ein Objekt der Klasse erstellen, in der sich die innere Klasse befindet, wie unten gezeigt:

//1创建内部类所在类的对象OuterClass outerObject=new OuterClass();//2创建内部类对象
//注意与静态嵌套类的构造器使用方法的差异OuterClass.InnerClass innerObject = outerObject.new InnerClass();
Nach dem Login kopieren

Schattierung verschachtelter Klassen

Wenn wir einen Typ deklarieren, wenn sein Name denselben Namen enthält wie die Deklaration eines anderen Typs im Codeblock (z. B. innerhalb einer Klasse), in dem sich der aktuelle Codeblock (z. B. innerhalb einer Methode) befindet lokalisiert, nennt man dieses Phänomen Maskierung. Wenn wir den maskierten Typ verwenden müssen, können wir nicht direkt auf seinen Namen verweisen, wie im folgenden Beispiel gezeigt:

public class ShadowTest {

    public int x = 0;
//嵌套类
    class FirstLevel {
//以下声明会遮蔽其所在类的名称为x的字段
        public int x = 1;
//以下方法的声明会遮蔽其所在类的名称为x的字段
        void methodInFirstLevel(int x) {
            System.out.println("x = " + x);
            System.out.println("this.x = " + this.x);
            System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);//注意this关键词的使用方法
        }
    }

    public static void main(String... args) {
        ShadowTest st = new ShadowTest();
        ShadowTest.FirstLevel fl = st.new FirstLevel();
        fl.methodInFirstLevel(23);
    }
}
Nach dem Login kopieren

Die Ausgabe des obigen Codes lautet:

x = 23
this.x = 1
ShadowTest.this.x = 0

Serialisierung, das Tutorial empfiehlt dringend, keine inneren Klassen zu serialisieren, Fragen hier hinterlassen.

Zusätzlich zu nicht statischen verschachtelten Klassen gibt es zwei Arten von inneren Klassen: eine ist eine lokale Klasse und die andere ist eine anonyme Klasse.

Partielle Klassen

Lokale Klassen können in jedem Codeblock (in geschweiften Klammern) definiert werden und werden im Allgemeinen in Methoden verwendet.

Lokale Klassen können Klassenmitglieder der obersten Klasse verwenden, in der sie sich befinden. Darüber hinaus können lokale Klassen auch lokale Variablen verwenden. Die von ihnen verwendeten lokalen Klassen müssen jedoch mit dem Schlüsselwort final geändert werden. das heißt, unveränderliche Variablen. In Java SE8 können lokale Klassen im Wesentlichen unveränderte lokale Variablen verwenden. Das heißt, selbst wenn die lokale Variable nicht mit dem Schlüsselwort final geändert wird, hat sich ihr Wert seit der Initialisierung nie geändert.

Ab Java8 können lokale Klassen auch Parameter ihrer Methoden verwenden.

Ähnlich wie innere Klassen können lokale Klassen keine statischen Mitglieder definieren und in statischen Methoden definierte lokale Klassen können keine Instanzmitglieder verwenden.

Schnittstellen können nicht in Codeblöcken definiert werden, da Schnittstellen statischer Natur sind. Excuse-Mitglieder können nicht in lokalen Klassen definiert werden, aber konstante Variablen können in lokalen Klassen definiert werden (mit final geändert, der Typ ist ein grundlegender Datentyp oder eine Zeichenfolge und wird zur Kompilierungszeit initialisiert).

Anonyme Klasse

Anonyme Klasse kann den Code prägnanter machen. Sie benötigt keinen Namen und kann in einem Schritt deklariert und instanziiert werden.

Die Deklaration einer anonymen Klasse ist ein Ausdruck, genau wie der Aufruf eines Konstruktors, mit der Ausnahme, dass ihm ein Codeblock folgt, der die Klasse definiert.

Der Ausdruck der Definition einer anonymen Klasse enthält die folgenden Teile:

neues Schlüsselwort

Eine Ausrede, die die anonyme Klasse implementieren muss, oder der Name des geerbten übergeordneten Elements Klasse

Ein Klammerpaar, das Parameter enthält, lassen Sie den Parameterteil leer.

Anonymer Klassenkörper, ähnlich dem Körper der Klasse, können Sie Methoden definieren

Anonyme Klasse Die verwendbaren Typen sind die gleichen wie bei lokalen Klassen:

Sie können die Klassenmitglieder der Klasse verwenden, in der sie sich befindet.

Sie können die lokale Variable mit verwenden der letzte Modifikator des Codeblocks, in dem er sich befindet, oder nicht mehr nach der Initialisierung. Zugewiesene lokale Variablen (java8)

Für schattierte Typen kann nicht direkt über den Namen referenziert werden

Ebenso anonyme Klassen Sie können keine statischen Mitglieder oder Schnittstellen deklarieren, aber sie können konstante Variablen deklarieren. In der anonymen Klasse können Sie Instanzfelder, Instanzmethoden, Instanzinitialisierungscodeblöcke und lokale Klassen deklarieren.


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage