Ключевое слово inner

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

Синтаксис

kotlinclass Outer {
  inner class Inner {
    // тело внутреннего класса
  }
}

Пример

Создадим внешний класс Outer с полем outerField и внутренний класс Inner, который имеет доступ к полю внешнего класса:

kotlinclass Outer {
  private val outerField: String = "Hello from Outer"
  
  inner class Inner {
    fun printOuterField() {
      println(outerField)
    }
  }
}

val outer = Outer()
val inner = outer.Inner()
inner.printOuterField()

Результат выполнения кода:

kotlinString "Hello from Outer"

Пример

Внутренний класс имеет доступ к this внешнего класса через квалификатор @Outer:

kotlinclass 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()

Результат выполнения кода:

kotlinString "Inner name: Inner"
String "Outer name: Outer"

Пример

Внутренний класс может обращаться к методам внешнего класса:

kotlinclass 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)

Результат выполнения кода:

kotlinString "Outer method called"

Пример

Без ключевого слова inner класс становится вложенным, но не внутренним, и не имеет доступа к членам внешнего класса:

kotlinclass Outer {
  private val outerField: String = "Hello"
  
  class Nested {
    // Ошибка компиляции: не видит outerField
    // fun printField() { println(outerField) }
  }
}

Смотрите также

  • ключевое слово class,
    которое используется для объявления классов
  • ключевое слово object,
    которое используется для создания объектов-одиночек
  • ключевое слово companion,
    которое используется для создания companion-объектов
  • ключевое слово nested,
    которое используется для вложенных классов