Kotlin 筆記:內部類與嵌套類

一、與 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") }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章