一、与 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") }