📜  Kotlin 嵌套类和内部类(1)

📅  最后修改于: 2023-12-03 14:43:41.963000             🧑  作者: Mango

Kotlin 嵌套类和内部类

在 Kotlin 中,我们可以在一个类中定义另一个类,这些嵌套在外部类中的类称为嵌套类或者内部类。虽然它们都是在外部类中定义的,但它们在编译后会被编译成不同的类。

嵌套类

嵌套类是一个完全独立的类,它不持有对外部类的引用。当我们定义一个嵌套类时,我们需要在它的前面加上 关键字 nested 或者 inner

class Outer {
    private val name: String = "outer"

    class Nested {
        fun introduce() = "I am a nested class."
    }
}

fun main() {
    val nested = Outer.Nested()
    println(nested.introduce())
}

如上所示,我们定义了一个名为 Outer 的类,并在其中定义了一个名为 Nested 的嵌套类。在 main 方法中,我们可以直接实例化 Nested 类,并调用 introduce() 方法。

当我们运行程序时,输出应该为:

I am a nested class.

因为嵌套类可以独立于外部类存在,所以通过嵌套类创建的对象不能访问外部类的任何成员。

内部类

内部类也是定义在外部类中的类,但它与嵌套类不同,内部类可以访问外部类的成员。当我们定义一个内部类时,我们需要在它的前面加上 inner 关键字。

class Outer {
    private val name: String = "outer"

    inner class Inner {
        fun introduce() = "I am an inner class of ${name}."
    }
}

fun main() {
    val outer = Outer()
    val inner = outer.Inner()
    println(inner.introduce())
}

如上所示,我们定义了一个名为 Outer 的类,并在其中定义了一个名为 Inner 的内部类。在 main 方法中,我们必须先实例化 Outer 类,然后才能在其上调用 Inner() 实例化内部类。在内部类的 introduce() 方法中,我们访问了外部类的 name 属性。

当我们运行程序时,输出应该为:

I am an inner class of outer.

需要注意的是,内部类会持有外部类的引用,因此我们在创建内部类的对象时需要先创建外部类的对象。

总结

通过以上的介绍,我们了解了 Kotlin 中的嵌套类和内部类的区别。嵌套类是独立于外部类存在的类,而内部类可以访问外部类的成员。当我们需要使用外部类的资源时,可以选择使用内部类,否则使用嵌套类就可以了。