0Pricing
Kotlin Academy · Урок

Вложенные классы

Классы внутри классов

«Вложенные классы» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Вложенные классы
  2. Внутренние классы
  3. Анонимные объекты
  4. Локальные классы
← Назад к Kotlin Academy