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

Основы Kotlin

Контроль потока в Kotlin

Функции в Kotlin

Строки в Kotlin

面向对象(OOP) в Kotlin

Вложенные и внутренние классы в Kotlin

В этой статье вы узнаете, как использовать вложенные и внутренние классы с помощью примеров.

Вложенные классы Kotlin

Как и в Java, Kotlin позволяет вам определять класс в другом классе, называемом вложенным классом.

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

Поскольку вложенный класс является внешним (Outer) членом его заключающего класса, вы можете использовать символы '.' для доступа к вложенному классу и его членам.

Пример: Использование вложенных классов в Kotlin

class Outer {
    val a = "Вне вложенного класса."
    class Nested {
        val b = "Inside the nested class."
        fun callMe() = "Вызов функции изнутри вложенного класса."
    }
}
fun main(args: Array<String>) {
    //Доступ к членам вложенного класса
    println(Outer.Nested().b)
    //Создание объекта вложенного класса
    val nested = Outer.Nested()
    println(nested.callMe())
}

При выполнении программы, вывод будет следующим:

Внутри вложенного класса.
Вызов функции изнутри вложенного класса.

Для пользователей Java

Внутренние классы Kotlin类似ны статическим внутренним классам в Java.

В Java, когда вы декларируете класс в другом классе, по умолчанию он становится внутренним классом. Но в Kotlin вам нужно использовать модификатор inner для создания внутреннего класса, о чем мы поговорим позже.

Внутренние классы Kotlin

Внутренние классы Kotlin не имеют права доступа к экземплярам внешнего класса. Например:

class Outer {
    val foo = "Outside the nested class."
    class Nested {
        //Ошибка! Не удалось получить доступ к членам внешнего класса.
        fun callMe() = foo
    }
}
fun main(args: Array<String>) {
    val outer = Outer()
    println(outer.Nested().callMe())
}

Этот код не может быть скомпилирован, потому что мы пытаемся получить доступ к свойству foo внешнего класса изнутри вложенного класса.

Чтобы решить эту проблему, вам нужно использовать маркер inner для создания внутреннего класса, поместив его в класс. Внутренний класс хранит ссылку на внешний класс и может обращаться к членам внешнего класса.

Пример: Использование внутренних классов в Kotlin

class Outer {
    val a = "Вне вложенного класса."
    inner class Inner {
        fun callMe() = a
    }
}
fun main(args: Array<String>) {
    val outer = Outer()
    println("Использование внешнего объекта: ${outer.Inner().callMe()}")
    val inner = Outer().Inner()
    println("Использование внутреннего объекта: ${inner.callMe()}")
}

При выполнении программы, вывод будет следующим:

Использование внешнего объекта: Вне вложенного класса.
Использование внутреннего объекта: Вне вложенного класса.