kotlin中 initconstructorcompanion object 调用顺序

Posted 一叶飘舟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kotlin中 initconstructorcompanion object 调用顺序相关的知识,希望对你有一定的参考价值。

 


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代码 合并到构造方法中,但会插到构造方法最前面。

参考文章:https://blog.csdn.net/wuqiqi1992/article/details/108103848

以上是关于kotlin中 initconstructorcompanion object 调用顺序的主要内容,如果未能解决你的问题,请参考以下文章

在 Kotlin 1.3 多平台 gradle 项目中参考来自 kotlin-jvm 的 kotlin-js 资源

kotlin和java区别

KotlinKotlin 与 Java 互操作 ③ ( Kotlin 中处理 Java 异常 | Java 中处理 Kotlin 异常 | @Throws 注解处理异常 | 函数类型互相操作 )

正如文档中所说,kotlin 1.2 中没有 kotlin.Math 类

Kotlin 的表单:如何在 Kotlin 的表单中添加下拉菜单 [重复]

Android@Kotlin 在Android studio 中配置Kotlin