在本文中,您将借助示例学习使用嵌套类和内部类。
与Java类似,Kotlin允许您在另一个称为嵌套类的类中定义一个类
class Outer { ... .. ... class Nested { ... .. ... } }
由于嵌套类是其封闭类的外部(Outer)成员,因此可以使用. 符号访问嵌套类及其成员。
class Outer { val a = "在嵌套类外部。" class Nested { val b = "在嵌套类内部。" fun callMe() = "从嵌套类内部进行函数调用。" } } fun main(args: Array<String>) { //访问嵌套类的成员 println(Outer.Nested().b) //创建嵌套类的对象 val nested = Outer.Nested() println(nested.callMe()) }
运行该程序时,输出为:
在嵌套类内部。 从嵌套类内部进行函数调用。
对于 Java 用户
Kotlin中的嵌套类类似于Java中的静态嵌套类。
在Java中,当您在另一个类中声明一个类时,默认情况下它将成为一个内部类。 但是在Kotlin中,您需要使用 inner 修饰符创建一个内部类,我们将在下面讨论。
Kotlin中的嵌套类无权访问外部类实例。 例如,
class Outer { val foo = "在嵌套类外部。" class Nested { //错误! 无法访问外部类的成员。 fun callMe() = foo } } fun main(args: Array<String>) { val outer = Outer() println(outer.Nested().callMe()) }
上面的代码无法编译,因为我们试图从嵌套类内部访问外部类的foo属性。
为了解决这个问题,您需要用 inner 标记嵌套类来创建一个内部类。内部类携带对外部类的引用,并且可以访问外部类成员。
class Outer { val a = "在嵌套类外部。" inner class Inner { fun callMe() = a } } fun main(args: Array<String>) { val outer = Outer() println("使用外部对象: ${outer.Inner().callMe()}") val inner = Outer().Inner() println("使用内部对象: ${inner.callMe()}") }
运行该程序时,输出为:
使用外部对象: 在嵌套类外部。 使用内部对象: 在嵌套类外部。