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

Ключевое слово nested применяется для объявления вложенных классов в Kotlin. Вложенные классы не имеют доступа к членам внешнего класса, если только эти члены не объявлены с модификатором companion. Для создания вложенного класса используется синтаксис class Outer { nested class Inner }.

Синтаксис

kotlinclass Outer {
  nested class Nested {
    // тело вложенного класса
  }
}

Пример

Создадим внешний класс Car с вложенным классом Engine:

kotlinclass Car {
  nested class Engine {
    fun start() {
      println("Engine started")
    }
  }
}

Пример

Создадим экземпляр вложенного класса:

kotlinval engine = Car.Engine()
engine.start()

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

kotlinString "Engine started"

Пример

Попытка доступа к членам внешнего класса из вложенного класса:

kotlinclass Car(val model: String = "Sedan") {
  nested class Engine {
    fun showModel() {
      // println(model) - ошибка компиляции!
      // Вложенный класс не имеет доступа к членам внешнего класса
    }
  }
}

Пример

Доступ к companion object из вложенного класса:

kotlinclass Car {
  companion object {
    const val BRAND = "Toyota"
  }
  
  nested class Engine {
    fun showBrand() {
      println("Brand: $BRAND")
    }
  }
}

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

kotlinval engine = Car.Engine()
engine.showBrand()
kotlinString "Brand: Toyota"

Пример

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

kotlinclass Computer {
  nested class Processor {
    val cores = 8
    val frequency = 3.5
    
    fun getInfo(): String {
      return "$cores cores, ${frequency}GHz"
    }
  }
}
kotlinval processor = Computer.Processor()
println(processor.getInfo())
println("Cores: ${processor.cores}")

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

kotlinString "8 cores, 3.5GHz"
String "Cores: 8"

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

  • ключевое слово open,
    которое разрешает наследование и переопределение
  • ключевое слово override,
    которое используется для переопределения методов и свойств
  • модификатор abstract,
    который объявляет абстрактные классы и члены
  • модификатор interface,
    который используется для объявления интерфейсов