跳到主要内容

Kotlin 嵌套类和内部类

提示
  1. Kotlin 嵌套类:在 Kotlin 中,你可以在一个类内部定义另一个类,这种内部定义的类称为嵌套类。嵌套类可以使用点号 . 访问,类似于 Java 中的静态嵌套类。
  2. 访问嵌套类:示例展示了如何访问嵌套类及其成员,包括创建嵌套类的实例和调用其函数。
  3. Kotlin 内部类:使用 inner 关键字可以创建内部类,这使得内部类能够访问外部类的成员。这与嵌套类不同,后者无法直接访问外部类的实例。

Kotlin 嵌套类

类似于 Java,Kotlin 允许你在另一个类中定义一个类,称为嵌套类。

class Outer {
... .. ...
class Nested {
... .. ...
}
}

由于 Nested 类是其封闭类 Outer 的成员,你可以使用 . 符号来访问 Nested 类及其成员。

示例:Kotlin 嵌套类

class Outer {

val a = "在嵌套类外部。"

class Nested {
val b = "在嵌套类内部。"
fun callMe() = "在嵌套类内部调用函数。"
}
}

fun main(args: Array<String>) {
// 访问嵌套类的成员
println(Outer.Nested().b)

// 创建嵌套类的对象
val nested = Outer.Nested()
println(nested.callMe())
}

当你运行程序时,输出将是:

在嵌套类内部。
在嵌套类内部调用函数。

对 Java 用户的说明

Kotlin 中的嵌套类类似于 Java 中的静态嵌套类。

在 Java 中,当你在一个类内声明另一个类时,默认成为内部类。然而在 Kotlin 中,你需要使用 inner 修饰符来创建一个内部类,我们接下来将讨论这个。

Kotlin 内部类

Kotlin 中的嵌套类无法访问外部类实例。例如,

class Outer {
val foo = "在嵌套类外部。"

class Nested {
// 错误!无法访问外部类的成员。
fun callMe() = foo
}
}

fun main(args: Array<String>) {

val outer = Outer()
println(outer.Nested().callMe())
}

以上代码无法编译,因为我们尝试从 Nested 类内部访问 Outer 类的 foo 属性。

为了解决这个问题,你需要用 inner 标记嵌套类,以创建一个内部类。内部类携带对外部类的引用,并且可以访问外部类的成员。

示例:Kotlin 内部类

class Outer {

val a = "在嵌套类外部。"

inner class Inner {
fun callMe() = a
}
}

fun main(args: Array<String>) {

val outer = Outer()
println("使用外部对象: ${outer.Inner().callMe()}")

val inner = Outer().Inner()
println("使用内部对象: ${inner.callMe()}")
}

当你运行程序时,输出将是:

使用外部对象: 在嵌套类外部。
使用内部对象: 在嵌套类外部。

推荐阅读:匿名内部类