Sobes.tech
Junior

Wie funktionieren die Schlüsselwörter 'super' und 'this' in Kotlin?

sobes.tech KI

Antwort von AI

this bezieht sich auf die aktuelle Instanz der Klasse oder den Empfänger eines Lambda-Ausdrucks. Es wird verwendet, um explizit ein Klassenmitglied oder eine Referenz auf das aktuelle Objekt anzugeben, wenn Mehrdeutigkeit besteht (z.B. bei einer lokalen Variablen mit demselben Namen).

super wird verwendet, um Methoden aufzurufen oder auf Eigenschaften der Elternklasse zuzugreifen. Es wird angewendet, wenn die Implementierung der Elternklasse anstelle der überschriebenen Implementierung in der aktuellen Klasse verwendet werden soll.

Beispiele:

class MyClass(val value: Int) {
    fun printValue() {
        println(this.value) // Explizite Verwendung von this zum Zugriff auf die Eigenschaft
    }
}

open class Parent {
    open fun greet() {
        println("Hallo vom Elternteil")
    }
}

class Child : Parent() {
    override fun greet() {
        super.greet() // Aufruf der Methode der Elternklasse
        println("Hallo vom Kind")
    }
}

Bei Verwendung in Lambda-Funktionen kann sich this auf den Empfänger der Lambda beziehen:

fun String.addExclamation(): String {
    return this + "!" // this bezieht sich auf die empfangende Zeichenkette
}

fun main() {
    val numbers = listOf(1, 2, 3)
    val sum = numbers.sum() // sum ist eine Erweiterungsfunktion, this innerhalb bezieht sich auf die Liste numbers
    println(sum)
}

Um Mehrdeutigkeiten zu klären, wenn verschachtelte Klassen oder Lambdas mit Empfängern vorhanden sind, kann man qualifizierten this verwenden (this@ClassName oder this@label):

class A { // implizites Label @A
    inner class B { // implizites Label @B
        fun Int.foo() { // implizites Label @foo
            val a = this@A // Referenz auf die Instanz von A
            val b = this@B // Referenz auf die Instanz von B
            val c = this // Referenz auf die Instanz von Int, Empfänger der Funktion foo
            val c1 = this@foo // Referenz auf die Instanz von Int, Empfänger der Funktion foo
        }
    }
}