嵌套和内部类

类可以嵌套在其他类中:

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

内部类

一个类可以标记为 inner,这样它就可以访问外部类的成员。内部类持有外部类对象的引用:

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

关于如何消除 this 在内部类中的歧义可参考限定的 this 表达式

匿名内部类

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

  1. window.addMouseListener(object: MouseAdapter() {
  2. override fun mouseClicked(e: MouseEvent) {
  3. // ...
  4. }
  5. override fun mouseEntered(e: MouseEvent) {
  6. // ...
  7. }
  8. })

如果这个对象是一个函数式的 Java 接口的实例(例如,一个带有单个抽象函数的 Java 接口),可以使用 lambda 表达式来创建,但是要把这个接口类型作为表达式的前缀:

  1. val listener = ActionListener { println("clicked") }