Назад к вопросам
Junior
142
questionbank

Как работают ключевые слова 'super' и 'this' в Kotlin?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

this ссылается на текущий экземпляр класса или получателя лямбда-выражения. Используется для явного указания члена класса или ссылки на текущий объект, когда возникает неоднозначность (например, при наличии локальной переменной с тем же именем).

super используется для вызова методов или доступа к свойствам из родительского класса. Применяется, когда нужно использовать реализацию родительского класса вместо переопределенной реализации в текущем классе.

Примеры:

class MyClass(val value: Int) {
    fun printValue() {
        println(this.value) // Явное использование this для доступа к свойству
    }
}

open class Parent {
    open fun greet() {
        println("Привет из родителя")
    }
}

class Child : Parent() {
    override fun greet() {
        super.greet() // Вызов метода родительского класса
        println("Привет из потомка")
    }
}

При использовании в лямбда-функциях, this может относиться к получателю лямбды:

fun String.addExclamation(): String {
    return this + "!" // this ссылается на строку-получатель
}

fun main() {
    val numbers = listOf(1, 2, 3)
    val sum = numbers.sum() // sum - функция расширения, this внутри ссылается на список numbers
    println(sum)
}

Для разрешения неоднозначности, когда у вас есть вложенные классы или лямбды с получателями, можно использовать квалифицированный this (например, this@ClassName или this@label).

class A { // неявный label @A
    inner class B { // неявный label @B
        fun Int.foo() { // неявный label @foo
            val a = this@A // ссылка этого на экземпляр A
            val b = this@B // ссылка этого на экземпляр B
            val c = this // ссылка этого на экземпляр Int, который является получателем функции foo
            val c1 = this@foo // ссылка этого на экземпляр Int, который является получателем функции foo
        }
    }
}