嵌套类和内部类在Kotlin中用于逻辑分组和封装外部类中的功能。
嵌套类的概念来源于Java,是组织代码和隔离辅助组件的一种方式。在Kotlin中,语法和方法从Java继承而来,但有重要的不同之处。
主要任务是合理地分离那些不应该在外部类上下文之外存在的辅助类,同时需要访问外部类成员的不同程度。在Java中,默认情况下,嵌套类是内部类,而在Kotlin中,默认是嵌套(静态的)。
在Kotlin中,类的默认声明导致在另一个类内部创建静态(嵌套)类,即该类没有访问外部类成员的权限。要获得访问权限,使用关键字inner。
代码示例:
class Outer { private val secret = "outside" class Nested { fun call() = "nested: no access to Outer.secret" } inner class Inner { fun call() = "inner: can access $secret" } }
关键特点:
class Nested)默认没有对外部类实例的引用;inner class Inner)有引用并可以访问外部类的成员,包括私有成员;嵌套类(nested)可以访问外部类的私有属性吗?
不可以,嵌套类(默认情况下)在Kotlin是静态的,没有对外部类的引用,因此无法访问它的属性和方法。
Kotlin和Java中的内部类有什么区别?
在Java中,嵌套类默认不是静态的,并且有对外部类的引用。在Kotlin中正好相反;嵌套类是静态的,只有内部类才拥有对外部实例的引用。
可以在对象(object)中声明内部类吗?
不可以,内部类(inner)不能在object中声明,因为object无法实例化。
开发人员声明了一个内部类,但没有使用外部类的属性:
class Container { inner class Helper { fun help() = "help" } }
优点:
可以轻松从外部对象获取该类。
缺点:
使用内部类实现对外部类私有状态的访问:
class Auth { private var token: String = "" inner class TokenManager { fun updateToken(new: String) { token = new } } }
优点:
缺点: