04-伴生对象
9.1.3 伴生对象
Kotlin并没有提供静态类成员的概念,但它提供了伴生对象来实现这一功能。在Kotlin中,使用关键字companion声明的对象称为伴生对象,伴生对象通常位于类的内部。
class MyClass {
companion object Factory {
fun create(): MyClass = MyClass()
}
}
伴生对象中定义的成员可以通过类名直接访问。代码如下。
val instance = MyClass.create()
当然,调用伴生对象时还可以省略伴生对象的名称,这时候直接使用类名. Companion的方式来完成调用。代码如下。
class MyClass {
companion object {
}
}
val x = MyClass.Companion
从上面的实例可以看出,调用伴生对象时不用创建包含伴生对象的实例,调用的方式主要有两种:一种是类名.伴生对象,另一种是类名. Companion。
虽然伴生对象的成员看起来像其他语言的静态成员,但在运行期间,它们仍然是真实对象的实例成员,这与静态成员是不一样的。同时,伴生对象还可以实现某些接口。代码如下。
interface Factory<T> {
fun create(): T
}
class MyClass {
companion object : Factory<MyClass> {
override fun create(): MyClass = MyClass()
}
}
当然,对于JVM平台来说,使用@JvmStatic注解时,Kotlin的编译器可以将伴生对象的成员生成为真正的静态方法和字段。