
上QQ阅读APP看书,第一时间看更新
2.3.2 伴生对象
Kotlin没有static关键字,在Kotlin类中也不能拥有静态属性和静态方法。使用伴生对象是解决这个问题的方法之一,它相当于Java的静态代码块。
Kotlin在类中使用companion object来创建伴生对象:

执行结果如下:
The Tony's mark is B The Tony's mark is C
Kotlin的每一个类可以有一个对应的伴生对象,伴生对象的成员类似于Java的静态成员。
如果Java想调用Kotlin伴生对象中的方法或属性,可以在伴生对象中的方法或属性上分别标注@JvmStatic、@JvmField,这样就可以像Kotlin一样来调用它们了。回顾一下2.1.1小节的例子,曾经介绍过@JvmStatic的使用。
之前使用对象声明创建过单例,下面使用伴生对象来创建懒汉模式的单例。

by lazy是Kotlin的委托属性,会在第5章中详细介绍。
介绍完伴生对象后,让我们来思考一个问题:某个类包括多个init初始化块、多个构造函数以及一个伴生对象,其伴生对象中也包含多个init初始化块,那么它们的执行顺序会是怎样的呢?
最后,我们小结一下object关键字的使用:
· Kotlin的对象声明是定义单例的一种方式,是延迟初始化的。
· Kotlin的对象表达式可以用来替代Java的匿名内部类,是实时创建的。
· Kotlin的伴生对象可以用来替代Java的静态属性和静态方法,是在伴生对象所在类加载时初始化的。