Назад к вопросам
Middle
113
questionbank

Что такое вложенные (nested) и внутренние (inner) классы в Kotlin?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Вложенный класс (nested) не имеет доступа к членам внешнего класса. Он является просто классом, объявленным внутри другого.

class Outer {
    private val outerParameter = 1
    class Nested {
        fun printSomething() {
            // Ошибка компиляции: Cannot access 'outerParameter': it is private in 'Outer'
            // println(outerParameter)
            println("Hello from nested class")
        }
    }
}

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

class Outer {
    private val outerParameter = 1
    inner class Inner {
        fun printSomething() {
            // Доступ к члену внешнего класса
            println("Outer parameter is $outerParameter")
            println("Hello from inner class")
        }
    }
}

Основные различия:

Особенность Вложенный класс (Nested) Внутренний класс (Inner)
Доступ к внешнему Нет Да (через экземпляр внешнего класса)
Связь с экземпляром Не связан с экземпляром внешнего класса Связан с экземпляром внешнего класса
Объявление Не требует ключевого слова (по умолчанию nested) Требует ключевое слово inner
Использование Может быть статическим аналогом (в контексте Java) Не может быть статическим
Создание экземпляра Outer.Nested() Outer().Inner()