# Kotlin 嵌套和内部类

> 原文： [https://beginnersbook.com/2019/03/kotlin-nested-and-inner-class/](https://beginnersbook.com/2019/03/kotlin-nested-and-inner-class/)

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

## Kotlin 嵌套类

当一个类在另一个类中声明时，它被称为嵌套类。嵌套类类似于 Java 中的[静态嵌套类](https://beginnersbook.com/2013/05/inner-class/)。

```kotlin
class OuterClass {
    ....
    class NestedClass {
        ...
    }
}
```

**注意事项：**

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

## Kotlin 嵌套类示例

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

```kotlin
class OuterClass {

    val oStr = "Outer Class"

    class NestedClass {
        val nStr = "Nested Class"
        fun demo() = "demo() function of nested class"
    }
}

fun main(args: Array<String>) {
    // accessing data member of nested class
    println(OuterClass.NestedClass().nStr)

    // accessing member function of nested class
    println(OuterClass.NestedClass().demo())

    // creating object of the Nested class
    val obj = OuterClass.NestedClass()
    println(obj.demo())
}
```

**输出：**

![Kotlin Nested and Inner Class](img/f15d87d588856ef545ddcc2f29439f1e.jpg)

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

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

```kotlin
class OuterClass {

    val oStr = "Outer Class"

    class NestedClass {
        val nStr = "Nested Class"
        fun demo() = "demo() function using $oStr"
    }
}

fun main(args: Array<String>) {
    println(OuterClass.NestedClass().demo())
}
```

**输出：**

```kotlin
Compilation Error
```

## Kotlin 内部类

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

```kotlin
class OuterClass {

    val oStr = "Outer Class"

    inner class InnerClass {
        val nStr = "Nested Class"
        fun demo() = "demo() function using $oStr"
    }
}

fun main(args: Array<String>) {
    val o = OuterClass()
    println("${o.InnerClass().demo()}")

    val i = OuterClass().InnerClass()
    println("${i.demo()}")
}
```

**输出：**

![Kotlin Inner Class](img/594d6647a664b7759a6d81bcfad381ce.jpg)