Ключевое слово inner
Ключевое слово inner
используется для объявления внутренних классов.
Внутренний класс имеет доступ ко всем членам внешнего класса,
включая приватные поля и методы. Для создания экземпляра внутреннего класса
необходим экземпляр внешнего класса.
Синтаксис
class Outer {
inner class Inner {
// тело внутреннего класса
}
}
Пример
Создадим внешний класс Outer
с полем outerField
и внутренний класс Inner
, который имеет доступ к полю внешнего класса:
class Outer {
private val outerField: String = "Hello from Outer"
inner class Inner {
fun printOuterField() {
println(outerField)
}
}
}
val outer = Outer()
val inner = outer.Inner()
inner.printOuterField()
Результат выполнения кода:
String "Hello from Outer"
Пример
Внутренний класс имеет доступ к this
внешнего класса
через квалификатор @Outer
:
class Outer {
val name: String = "Outer"
inner class Inner {
val name: String = "Inner"
fun printNames() {
println("Inner name: " + this.name)
println("Outer name: " + this@Outer.name)
}
}
}
val outer = Outer()
val inner = outer.Inner()
inner.printNames()
Результат выполнения кода:
String "Inner name: Inner"
String "Outer name: Outer"
Пример
Внутренний класс может обращаться к методам внешнего класса:
class Outer {
private fun outerMethod(): String {
return "Outer method called"
}
inner class Inner {
fun callOuterMethod(): String {
return outerMethod()
}
}
}
val outer = Outer()
val inner = outer.Inner()
val res = inner.callOuterMethod()
println(res)
Результат выполнения кода:
String "Outer method called"
Пример
Без ключевого слова inner
класс становится вложенным,
но не внутренним, и не имеет доступа к членам внешнего класса:
class Outer {
private val outerField: String = "Hello"
class Nested {
// Ошибка компиляции: не видит outerField
// fun printField() { println(outerField) }
}
}