5.8.9.4 嵌套类与内部类

原文链接: https://kotlinlang.org/docs/nested-classes.html

5.8.9.4 嵌套类与内部类

类可以嵌套在其他类中:

1
2
3
4
5
6
7
8
class Outer {
    private val bar: Int = 1
    class Nested {
        fun foo() = 2
    }
}

val demo = Outer.Nested().foo() // == 2

接口也可以嵌套使用。类与接口的各种组合都是可能的:你可以在类中嵌套接口、在接口中嵌套类,也可以在接口中嵌套接口。

1
2
3
4
5
6
7
8
9
interface OuterInterface {
    class InnerClass
    interface InnerInterface
}

class OuterClass {
    class InnerClass
    interface InnerInterface
}

内部类

标记为 inner 的嵌套类可以访问其外部类的成员。内部类持有对外部类对象的引用:

1
2
3
4
5
6
7
8
class Outer {
    private val bar: Int = 1
    inner class Inner {
        fun foo() = bar
    }
}

val demo = Outer().Inner().foo() // == 1

关于内部类中 this 的消歧,请参阅带限定符的 this 表达式。

匿名内部类

匿名内部类实例通过对象表达式创建:

1
2
3
4
5
6
window.addMouseListener(object : MouseAdapter() {

    override fun mouseClicked(e: MouseEvent) { ... }

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

注意: 在 JVM 上,如果该对象是某个函数式 Java 接口(即只含一个抽象方法的 Java 接口)的实例,你可以用前缀为该接口类型的 lambda 表达式来创建它:kotlin val listener = ActionListener { println("clicked") }