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