📜  Kotlin嵌套和内部类

📅  最后修改于: 2020-10-05 14:51:26             🧑  作者: Mango

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

Kotlin嵌套类

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

class Outer {
    ... .. ...
    class Nested {
        ... .. ...
    }
}

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


示例:Kotlin嵌套类

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) {
    // accessing member of Nested class
    println(Outer.Nested().b)

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

运行该程序时,输出为:

Inside Nested class.
Function call from inside Nested class.

对于Java用户

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

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


科特林内层阶级

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

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

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

fun main(args: Array) {

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

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

为了解决此问题,您需要将嵌套类标记为inner来创建一个内部类。内部类对外部类进行引用,并且可以访问外部类成员。


示例:科特林内层阶级

class Outer {

    val a = "Outside Nested class."

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

fun main(args: Array) {

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

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

运行该程序时,输出为:

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

推荐读物: 匿名内部类