Вложенные классы
Классы внутри классов
«Вложенные классы» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.
Классы внутри классов
Kotlin позволяет объявлять класс внутри другого класса. По умолчанию такой класс является nested и не содержит ссылки на экземпляр внешнего класса.
class Outer {
class Nested {
fun hello() = "Hi from Nested"
}
}
fun main() {
println(Outer.Nested().hello())
}Создание экземпляра nested
Поскольку вложенный класс независим, его создают через имя внешнего класса без экземпляра внешнего класса: Outer.Nested().
class Computer {
class Cpu {
val cores = 8
}
}
fun main() {
val cpu = Computer.Cpu()
println(cpu.cores)
}Нет доступа к членам внешнего класса
Вложенный класс не может обращаться к членам экземпляра внешнего класса, поскольку у него нет ссылки на внешний объект. Он ведёт себя как класс верхнего уровня в области видимости, заданной именем.
class Bank {
val name = "ACME"
class Branch {
fun describe() = "A branch"
}
}
fun main() {
println(Bank.Branch().describe())
}Зачем использовать вложенность
Вложенность выражает логическую группировку: внутренний тип концептуально принадлежит внешнему, что улучшает организацию и пространство имён.
class Http {
class Request(val url: String)
}
fun main() {
val r = Http.Request("/home")
println(r.url)
}Вложенный класс со свойствами
Вложенные классы — обычные классы: у них могут быть конструкторы, свойства и методы.
class Garage {
class Car(val model: String) {
fun honk() = "$model: beep"
}
}
fun main() {
println(Garage.Car("Tesla").honk())
}Доступ к членам объекта-компаньона и статическим аналогам
К вложенным классам можно обращаться из любого места по имени внешнего класса, подобно статическому вложенному классу в Java.
class Config {
class Defaults {
val timeout = 30
}
}
fun main() {
println(Config.Defaults().timeout)
}Несколько вложенных классов
Внешний класс может содержать несколько вложенных классов, чтобы объединять связанные типы.
class Shapes {
class Circle(val r: Int)
class Square(val side: Int)
}
fun main() {
println(Shapes.Circle(5).r)
println(Shapes.Square(4).side)
}Вложенный класс внутри вложенного
Можно создавать вложенность более чем одного уровня, хотя глубокая вложенность может ухудшить читаемость.
class A {
class B {
class C {
val value = 42
}
}
}
fun main() {
println(A.B.C().value)
}Вложенный класс и класс верхнего уровня
Функционально вложенный класс подобен классу верхнего уровня; единственное различие — его полное имя. Используйте вложенность, если связь между типами делает код понятнее.
class Order {
class Item(val price: Int)
}
fun main() {
val total = Order.Item(10).price + Order.Item(5).price
println(total)
}Практическая группировка
Размещение типа результата построителя внутри класса-владельца выглядит естественно.
class Parser {
class Result(val ok: Boolean, val message: String)
fun parse(text: String) = Result(text.isNotEmpty(), "parsed")
}
fun main() {
val res = Parser().parse("data")
println("${res.ok} ${res.message}")
}Главное правило
Ключевое слово, благодаря которому класс хранит ссылку на внешний экземпляр, — inner. Без него вложенный класс ведёт себя подобно статическому и изолирован от внешнего класса.
class Box {
class Lid
}
fun main() {
println(Box.Lid() != null)
}Быстрая проверка
Проверьте, насколько хорошо Вы поняли вложенные классы.
Итоги
Вы узнали о вложенных классах:
- Они объявляются внутри другого класса; по умолчанию используется
class(вложенный класс). - У них нет ссылки на внешний экземпляр, поэтому они не могут обращаться к членам внешнего класса.
- Они создаются через имя внешнего класса:
Outer.Nested(). - Они отлично подходят для логической группировки и организации пространства имён.
class Outer {
class Nested { val x = 1 }
}
fun main() {
println(Outer.Nested().x)
}Часто задаваемые вопросы
Урок «Вложенные классы» бесплатный?
Да — полный текст урока «Вложенные классы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.
Чему я научусь в уроке «Вложенные классы»?
Классы внутри классов Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kotlin Academy?
Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Вложенные классы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kotlin Academy?
Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Вложенные классы
- Внутренние классы
- Анонимные объекты
- Локальные классы