一、與 Java 的對比
形式 \ 語言 | Kotlin | Java |
---|---|---|
一個 class 內聲明另一個 class | 嵌套類 | 內部類 |
inner | 內部類 | 無 |
static | 無 | 靜態內部類 |
名稱 | 含義 |
---|---|
內部類(Java、Kotlin) | 持有外部類的引用 |
嵌套類(Kotlin) | 不持有外部類的引用 |
靜態內部類(Java) | 不持有外部類的引用 |
二、嵌套類
形式:沒有關鍵詞,直接在其他類內部聲明。
這種形式是最普遍的形式,因爲沒有其他關鍵字進行修飾,可以稱爲默認形式。
Java 比較開放,認爲默認形式的類可以訪問外部類。
Kotlin 比較封閉,認爲默認形式的類不能訪問外部類。
class Outer {
private val bar: Int = 1
class Nested {
fun foo() = 2
}
}
val demo = Outer.Nested().foo() // == 2
三、內部類
形式:在嵌套類的基礎上添加 inner 關鍵字。
Kotlin 的默認形式不能訪問外部,要想訪問,需要額外添加一個 inner
關鍵字。
Java 的默認形式可以訪問外部,要想不訪問,需要額外添加一個 static
關鍵字。
class Outer {
private val bar: Int = 1
inner class Inner {
fun foo() = bar
}
}
val demo = Outer().Inner().foo() // == 1
四、匿名內部類
匿名內部類與 inner 就沒有關係了,需要使用 object 關鍵字。
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) { ... }
override fun mouseEntered(e: MouseEvent) { ... }
})
如果匿名內部類只有一個方法,可以簡化爲一個 lambda 表達式。
val listener = ActionListener { println("clicked") }