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

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

Короткий ответ

Что ответить на собеседовании

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

Подробный разбор

Ответ с пояснениями

Вложенный класс (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()

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее