kotlin的主构造函数,次构造函数,init代码块,伴生对象的执行顺序,特点,使用场景,及跟java的比较

 

kotlin的主构造函数, 次构造函数, init代码块, 伴生对象的执行顺序, 特点, 使用场景, 及跟java的比较 

 

目录

kotlin的主构造函数, 次构造函数, init代码块, 伴生对象的执行顺序, 特点, 使用场景, 及跟java的比较 

测试代码1:

结果1: 

测试代码2:

结果2: 

结论--执行顺序: 

结论--跟java的比较, 特点, 使用场景: 

Java的初始化块、静态初始化块、构造函数的执行顺序及用途


 

 

测试代码1:

class Person(var from: String) {

    /*属性from*/
    //已经在主构造函数中声明 private var from: String = ""

    /*次构造方法*/
    constructor(from1: String, name: String) : this(from1) {
        println("constructor, from:$from1\n")
    }

    companion object {
        val instance = Person("companion")

        /*伴生对象中的初始化代码*/
        init {
            println("companion init 1\n")
        }

        init {
            println("companion init 2\n")
        }

        /* 伴生对象中不允许有构造函数
        constructor() {
            println("companion constructor\n")
        } */
    }

    /*初始化代码块*/
    init {
        println("init 2, from:${from}\n")
    }

    /*初始化代码块*/
    init {
        println("init 1, from:${from}\n")
    }

}

fun main(args: Array<String>) {
    println("调用次构造方法:\n")
    Person("main1", "name1")

    println("\n\n调用主构造方法:\n")
    Person("main2")
}

 

结果1: 

调用次构造方法:
init 2, from:companion
init 1, from:companion
companion init 1
companion init 2
init 2, from:main1
init 1, from:main1
constructor, from:main1


调用主构造方法:
init 2, from:main2
init 1, from:main2

 

测试代码2:

如果把main函数改成: 

fun main(args: Array<String>) {
    println("\n\n调用主构造方法:\n")
    Person("main2")

    println("\n\n调用次构造方法:\n")
    Person("main1", "name1")
}

 

结果2: 

调用主构造方法:
init 2, from:companion
init 1, from:companion
companion init 1
companion init 2
init 2, from:main2
init 1, from:main2


调用次构造方法:
init 2, from:main1
init 1, from:main1
constructor, from:main1

 

结论--执行顺序: 

1. 伴生对象中成员变量初始化

2. 伴生对象中init代码块按先后顺序执行

3. 类的init代码块按先后顺序执行

4. 类的主构造函数

5. 类的次构造函数

 

 

结论--跟java的比较, 特点, 使用场景: 

 

1.  kotlin的伴生对象(companion object)相当于java中的静态初始化块(static {}), 只被同个类的所有实例的第一个实例执行一次, 用于静态成员变量初始化和初始化代码

2. kotlin的init代码块(init {})相当于java的非静态初始化块({}), 每个类实例都会执行, 且按先后顺序执行, 用于对多个构造函数的代码复用

3. kotlin的主构造函数, 在java中没有, 比次构造函数(constructor)先执行 (从次构造函数需要继承 : this()主构造函数已经可以推测是主构造函数先执行), 每个类实例都会执行, 用于类成员变量的声明/赋值, 由于没有代码块, 所以不能做其他初始化逻辑

4. kotlin的次构造函数(constructor)相当于java的构造函数, 函数签名要跟主构造函数不一样, 否则报错, 可以重载出多个次构造函数, 用于类初始化, 由于有代码块, 所以可以做其他初始化逻辑

 

 

Java的初始化块、静态初始化块、构造函数的执行顺序及用途


https://blog.csdn.net/guyue35/article/details/105094901

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章