原文: https://beginnersbook.com/2019/03/kotlin-nested-and-inner-class/

在本指南中,您将通过示例了解 Kotlin 中的嵌套和内部类。

Kotlin 嵌套类

当一个类在另一个类中声明时,它被称为嵌套类。嵌套类类似于 Java 中的静态嵌套类

  1. class OuterClass {
  2. ....
  3. class NestedClass {
  4. ...
  5. }
  6. }

注意事项:

  1. 嵌套类无法访问外部类的成员。
  2. 要访问嵌套类的成员,我们将点(.)运算符与外部类一起使用。

Kotlin 嵌套类示例

在下面的示例中,我们有一个外部类和一个嵌套类。此示例演示如何使用点(.)运算符访问嵌套类的成员。

  1. class OuterClass {
  2. val oStr = "Outer Class"
  3. class NestedClass {
  4. val nStr = "Nested Class"
  5. fun demo() = "demo() function of nested class"
  6. }
  7. }
  8. fun main(args: Array<String>) {
  9. // accessing data member of nested class
  10. println(OuterClass.NestedClass().nStr)
  11. // accessing member function of nested class
  12. println(OuterClass.NestedClass().demo())
  13. // creating object of the Nested class
  14. val obj = OuterClass.NestedClass()
  15. println(obj.demo())
  16. }

输出:

Kotlin 嵌套和内部类 - 图1

Kotlin 嵌套类 - 无法访问外部类的成员

以下程序将抛出编译错误,因为嵌套类无法访问外部类的成员。这里嵌套类试图访问属于外部类的成员oStr,因此我们得到一个编译错误。我们可以通过使用内部类来解决这个问题,这将在同一篇文章的下一节中讨论。

  1. class OuterClass {
  2. val oStr = "Outer Class"
  3. class NestedClass {
  4. val nStr = "Nested Class"
  5. fun demo() = "demo() function using $oStr"
  6. }
  7. }
  8. fun main(args: Array<String>) {
  9. println(OuterClass.NestedClass().demo())
  10. }

输出:

  1. Compilation Error

Kotlin 内部类

使用inner修饰符声明 Kotlin 内部类。内部类可以访问外部类的成员。让我们使用上面使用内部类而不是嵌套类的相同示例。这里我们使用内部内部类访问外部类的成员oStr

  1. class OuterClass {
  2. val oStr = "Outer Class"
  3. inner class InnerClass {
  4. val nStr = "Nested Class"
  5. fun demo() = "demo() function using $oStr"
  6. }
  7. }
  8. fun main(args: Array<String>) {
  9. val o = OuterClass()
  10. println("${o.InnerClass().demo()}")
  11. val i = OuterClass().InnerClass()
  12. println("${i.demo()}")
  13. }

输出:

Kotlin 嵌套和内部类 - 图2