ネストされたクラス

クラスは他のクラスの中に入れ子にすることができます:

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


内部クラス内での this の曖昧さ回避について学ぶために、修飾された this 式を参照してください。

無名内部クラス

無名内部クラスのインスタンスはオブジェクト式を使用して作成されます:

window.addMouseListener(object: MouseAdapter() {
 override fun mouseClicked(e: MouseEvent) {
   // ...
 }

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


オブジェクトが機能的なJavaインタフェースのインスタンス(つまり、あるJavaインタフェースがひとつの抽象メソッドとひもづく)である場合は、インタフェースの型が前に付いたラムダ式を使用してオブジェクトを作成できます。

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