如果你有一個類別宣告後,裡面又宣告一個類別,就稱作 Nested class。
說明
一個基本的用法如下。
class Outer {
private val bar: Int = 1
class Nested {
fun foo() = 2
}
}
val demo = Outer.Nested().foo() // == 2
所以當你要呼叫 foo 就必須透過 Outer 物件內的 Nested 物件呼叫。
但是如果你要在 foo 內呼叫外層的成員變數的話,是無法呼叫的。
class Outer {
private val bar: Int = 1
class Nested {
fun foo() {
println("bar:$bar") // unresolved reference: bar
}
}
}
Inner classes
再把剛剛的例子拿出來看,如果我們換成 inner class 的情況,就可以存取 Outter class 了。
class Outer {
private val bar: Int = 1
inner class Inner {
fun foo() = bar
}
}
val demo = Outer().Inner().foo() // == 1
Anonymous inner classes
你也可以使用 object 來實作 Anonymous inner classes
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) { ... }
override fun mouseEntered(e: MouseEvent) { ... }
})