原文: https://www.programiz.com/kotlin-programming/inner-nested-class

在本文中,您将借助示例学习使用嵌套类和内部类。

Kotlin 嵌套类

与 Java 类似,Kotlin 允许您在另一个称为嵌套类的类中定义一个类。

  1. class Outer {
  2. ... .. ...
  3. class Nested {
  4. ... .. ...
  5. }
  6. }

由于Nested类是其封闭类Outer的成员,因此可以使用.表示法访问Nested类及其成员。


示例:Kotlin 嵌套类

  1. class Outer {
  2. val a = "Outside Nested class."
  3. class Nested {
  4. val b = "Inside Nested class."
  5. fun callMe() = "Function call from inside Nested class."
  6. }
  7. }
  8. fun main(args: Array<String>) {
  9. // accessing member of Nested class
  10. println(Outer.Nested().b)
  11. // creating object of Nested class
  12. val nested = Outer.Nested()
  13. println(nested.callMe())
  14. }

运行该程序时,输出为:

  1. Inside Nested class.
  2. Function call from inside Nested class.

适用于 Java 用户

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

在 Java 中,当您在另一个类中声明一个类时,默认情况下它将成为一个内部类。 但是在 Kotlin 中,您需要使用inner修饰符来创建一个内部类,我们将在下面讨论。


Kotlin 内部类

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

  1. class Outer {
  2. val foo = "Outside Nested class."
  3. class Nested {
  4. // Error! cannot access member of outer class.
  5. fun callMe() = foo
  6. }
  7. }
  8. fun main(args: Array<String>) {
  9. val outer = Outer()
  10. println(outer.Nested().callMe())
  11. }

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

为了解决此问题,您需要使用inner标记嵌套的类以创建内部类。 内部类带有对外部类的引用,并且可以访问外部类成员。


示例:Kotlin 内部类

  1. class Outer {
  2. val a = "Outside Nested class."
  3. inner class Inner {
  4. fun callMe() = a
  5. }
  6. }
  7. fun main(args: Array<String>) {
  8. val outer = Outer()
  9. println("Using outer object: ${outer.Inner().callMe()}")
  10. val inner = Outer().Inner()
  11. println("Using inner object: ${inner.callMe()}")
  12. }

运行该程序时,输出为:

  1. Using outer object: Outside Nested class.
  2. Using inner object: Outside Nested class.

推荐阅读匿名内部类