# Kotlin 嵌套和内部类

> 原文： [https://www.programiz.com/kotlin-programming/inner-nested-class](https://www.programiz.com/kotlin-programming/inner-nested-class)

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

## Kotlin 嵌套类

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

```kt
class Outer {
    ... .. ...
    class Nested {
        ... .. ...
    }
}
```

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

* * *

### 示例：Kotlin 嵌套类

```kt
class Outer {

    val a = "Outside Nested class."

    class Nested {
        val b = "Inside Nested class."
        fun callMe() = "Function call from inside Nested class."
    }
}

fun main(args: Array<String>) {
    // accessing member of Nested class
    println(Outer.Nested().b)

    // creating object of Nested class
    val nested = Outer.Nested()
    println(nested.callMe())
}
```

运行该程序时，输出为：

```kt
Inside Nested class.
Function call from inside Nested class.
```

* * *

**适用于 Java 用户**

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

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

* * *

## Kotlin 内部类

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

```kt
class Outer {
    val foo = "Outside Nested class."

    class Nested {
        // Error! cannot access member of outer class.
        fun callMe() = foo
    }
}

fun main(args: Array<String>) {

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

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

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

* * *

### 示例：Kotlin 内部类

```kt
class Outer {

    val a = "Outside Nested class."

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

fun main(args: Array<String>) {

    val outer = Outer()
    println("Using outer object: ${outer.Inner().callMe()}")

    val inner = Outer().Inner()
    println("Using inner object: ${inner.callMe()}")
}
```

运行该程序时，输出为：

```kt
Using outer object: Outside Nested class.
Using inner object: Outside Nested class.
```

* * *

**推荐阅读**： *匿名内部类*