Вложенные и внутренние классы

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

class Outer {
    private val bar: Int = 1
    class Nested {
        fun foo() = 2
    }
}

val demo = Outer.Nested().foo() // == 2

Внутренние классы

Класс может быть помечен как inner, что дает возможность доступа к членам внешнего класса. Внутренние классы содержать ссылку на объект внешнего класса.

class Outer {
    private val bar: Int = 1
    inner class Inner {
        fun foo() = bar
    }
}

val demo = Outer().Inner().foo() // == 1

Анонимные внутренние классы

Экземпляры анонимных внутренних классов создаются используя object выражение:

window.addMouseListener(object: MouseAdapter() {

    override fun mouseClicked(e: MouseEvent) { ... }

    override fun mouseEntered(e: MouseEvent) { ... }
})

Если объект является экземпляром функционального Java интерфейса, то есть у Java интерфейса один абстрактным метод, то вы можете создать объект используя лямбда выражение с префиксом в виде типа интрефейса:

val listener = ActionListener { println("clicked") }

Комментарии

Популярные сообщения из этого блога

Псевдонимы типов

Идиомы

Базовый синтаксис