English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Kotlin Eingeschlossene und interne Klassen

In diesem Artikel werden Sie durch Beispiele lernen, wie Sie geschachtelte und innere Klassen verwenden.

Kotlin geschachtelte Klasse

Wie in Java ermöglicht Kotlin Ihnen, in einer anderen Klasse, die als geschachtelte Klasse bezeichnet wird, eine Klasse zu definieren

class Outer {
    ... .. ...
    class Nested {
        ... .. ...
    }
}

Da die geschachtelte Klasse ein externes (Outer) Mitglied der umschließenden Klasse ist, können Sie das Punkt-Symbol verwenden, um auf die geschachtelte Klasse und ihre Mitglieder zuzugreifen.

Beispiel: Beispiel für die Verwendung von geschachtelten Klassen in Kotlin

class Outer {
    val a = "In der äußeren Klasse."
    class Nested {
        val b = "Innerhalb der geschachtelten Klasse."
        fun callMe() = "Funktion von innen aufgerufen."
    }
}
fun main(args: Array<String>) {
    //Mitglied der geschachtelten Klasse aufrufen
    println(Outer.Nested().b)
    //Objekt der geschachtelten Klasse erstellen
    val nested = Outer.Nested()
    println(nested.callMe())
}

Beim Ausführen des Programms wird ausgegeben:

Innerhalb der geschachtelten Klasse
Funktion aufrufen von innen

Für Java-Nutzer

Geschachtelte Klassen in Kotlin ähneln den statischen geschachtelten Klassen in Java.

In Java wird eine in einer anderen Klasse deklarierte Klasse standardmäßig zu einer inneren Klasse. In Kotlin müssen Sie jedoch die Modifizierer 'inner' verwenden, um eine innere Klasse zu erstellen, was wir weiter unten besprechen werden.

Kotlin innere Klasse

In Kotlin haben geschachtelte Klassen kein Recht, auf Instanzen der externen Klasse zuzugreifen. Zum Beispiel

class Outer {
    val foo = "Außerhalb der geschachtelten Klasse."
    class Nested {
        //Fehler! Der Zugriff auf die Mitglieder der externen Klasse ist nicht möglich.
        fun callMe() = foo
    }
}
fun main(args: Array<String>) {
    val outer = Outer()
    println(outer.Nested().callMe())
}

Der obige Code kann nicht kompiliert werden, weil wir versucht haben, auf das Attribut 'foo' der externen Klasse von innen auf die innere Klasse zuzugreifen.

Um dieses Problem zu lösen, müssen Sie eine innere Klasse mit dem Marker 'inner' verwenden, um eine innere Klasse zu erstellen. Eine innere Klasse trägt eine Referenz auf den externen Klassen und kann auf die Mitglieder der externen Klasse zugreifen.

Beispiel: Verwenden von inneren Klassen in Kotlin

class Outer {
    val a = "In der äußeren Klasse."
    inner class Inner {
        fun callMe() = a
    }
}
fun main(args: Array<String>) {
    val outer = Outer()
    println("Verwenden Sie externe Objekte: ${outer.Inner().callMe()}")
    val inner = Outer().Inner()
    println("Verwenden Sie interne Objekte: ${inner.callMe()}")
}

Beim Ausführen des Programms wird ausgegeben:

Verwenden Sie externe Objekte: In der äußeren Klasse.
Verwenden Sie interne Objekte: In der äußeren Klasse.