• 作者:老汪软件技巧
  • 发表时间:2024-09-22 11:00
  • 浏览量:

写在前面

两者的选择取决于是否需要访问外部类的成员。如果需要访问外部类成员,选择 inner;否则使用嵌套类(静态内部类)。

Inner类(内部类)

inner 类会持有对外部类的引用,因此可以访问外部类的属性和方法。它比较适用于需要频繁访问外部类成员的场景。

示例:

class OuterClass {
    private var outerProperty: String = "I am from OuterClass"
    // 使用 inner 声明内部类
    inner class InnerClass {
        fun accessOuter() {
            // 通过 this@OuterClass 引用外部类
            println("Accessing from InnerClass: $outerProperty")
        }
    }
}
fun main() {
    val outer = OuterClass()
    val inner = outer.InnerClass() // 创建内部类实例
    inner.accessOuter() // 调用内部类方法访问外部类成员
}

输出如下:

Accessing from InnerClass: I am from OuterClass

使用场景

嵌套类(静态内部类)

Kotlin 中默认的嵌套类是静态的,也就是说它不持有对外部类的引用,因此不能访问外部类的成员。

示例:

class OuterClass {
    private var outerProperty: String = "I am from OuterClass"
    // 嵌套类(默认静态)
    class NestedClass {
        fun showMessage() {
            // 无法访问 outerProperty,因为嵌套类不持有对外部类的引用
            println("This is a nested class")
        }
    }
}
fun main() {
    val nested = OuterClass.NestedClass() // 创建嵌套类实例
    nested.showMessage() // 调用嵌套类方法
}

输出如下:

This is a nested class

使用场景

总结特点Inner 类嵌套类(静态内部类)

是否持有外部类引用

持有外部类引用,可以访问外部类成员

不持有外部类引用,不能访问外部类成员

用途

需要访问外部类的成员

不需要访问外部类成员

使用场景

事件监听、UI交互等复杂交互场景

工具类、辅助类,避免内存泄漏的场景