kotlin中 init、constructor、companion object 调用顺序

1,486 阅读1分钟
 
class Human {
 
    private var work: String = "医生"
 
    constructor() {
        println("主构造方法 constructor")
    }
 
    constructor(name: String) {
        println("带参数次构造方法 constructor $name")
    }
 
    init {
        println("TestInit init")
    }
 
    init {
        println("TestInit init $work")
    }
 
    companion object {
 
        val instance: Human by lazy {
            Human("John")
        }
 
        init {
            println("companion init one")
        }
 
        init {
            println("companion init two")
        }
    }
 
}

调用 Human() ,出现结果:

companion init one
companion init two
Human init
Human init 医生
主构造方法 constructor

调用有参构造方法 Human("Tom") ,出现结果

companion init one
companion init two
Human init
Human init 医生
带参数次构造方法 constructor Tom

调用有参构造方法 Human.instance ,出现结果

companion init one
companion init two
Human init
Human init 医生
带参数次构造方法 constructor John

Kotlin 中的 init 代码块就相当于 Java 中的普通代码块,在创建对象的时候代码块会先执行。注意是每次创建都会执行一遍

那如果伴生对象里的 instance 不是懒加载的,出现结果

Human init
Human init 医生
带参数构造方法 constructor John
companion init one
companion init two

对于伴生对象,我们可以这样简单的理解

Kotlin 中的伴生对象相当于 Java 中的 Static 关键字。
伴生对象里的 init 代码块就相当于 Java 中的静态代码块。在类加载的时候会优先执行且只会执行一次。

总结:由于伴生对象中的代码是在类加载时就会执行,所以伴生类初始化会先执行,再执行本身构造方法, 会把 init 代码 合并到构造方法中,但会插到构造方法最前面。

参考文章:blog.csdn.net/wuqiqi1992/…