English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этой статье вы узнаете, как использовать вложенные и внутренние классы с помощью примеров.
Как и в Java, Kotlin позволяет вам определять класс в другом классе, называемом вложенным классом.
class Outer { ... .. ... class Nested { ... .. ... } }
Поскольку вложенный класс является внешним (Outer) членом его заключающего класса, вы можете использовать символы '.' для доступа к вложенному классу и его членам.
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 не имеют права доступа к экземплярам внешнего класса. Например:
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 для создания внутреннего класса, поместив его в класс. Внутренний класс хранит ссылку на внешний класс и может обращаться к членам внешнего класса.
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()}") }
При выполнении программы, вывод будет следующим:
Использование внешнего объекта: Вне вложенного класса. Использование внутреннего объекта: Вне вложенного класса.