目录
kotlin的主构造函数, 次构造函数, init代码块, 伴生对象的执行顺序, 特点, 使用场景, 及跟java的比较
测试代码1:
结果1:
测试代码2:
结果2:
结论--执行顺序:
结论--跟java的比较, 特点, 使用场景:
Java的初始化块、静态初始化块、构造函数的执行顺序及用途
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) {
println("调用次构造方法:\n")
Person("main1", "name1")
println("\n\n调用主构造方法:\n")
Person("main2")
}
调用次构造方法:
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
如果把main函数改成:
fun main(args: Array) {
println("\n\n调用主构造方法:\n")
Person("main2")
println("\n\n调用次构造方法:\n")
Person("main1", "name1")
}
调用主构造方法:
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. 类的次构造函数
1. kotlin的伴生对象(companion object)相当于java中的静态初始化块(static {}), 只被同个类的所有实例的第一个实例执行一次, 用于静态成员变量初始化和初始化代码
2. kotlin的init代码块(init {})相当于java的非静态初始化块({}), 每个类实例都会执行, 且按先后顺序执行, 用于对多个构造函数的代码复用
3. kotlin的主构造函数, 在java中没有, 比次构造函数(constructor)先执行 (从次构造函数需要继承 : this()主构造函数已经可以推测是主构造函数先执行), 每个类实例都会执行, 用于类成员变量的声明/赋值, 由于没有代码块, 所以不能做其他初始化逻辑
4. kotlin的次构造函数(constructor)相当于java的构造函数, 函数签名要跟主构造函数不一样, 否则报错, 可以重载出多个次构造函数, 用于类初始化, 由于有代码块, 所以可以做其他初始化逻辑
https://blog.csdn.net/guyue35/article/details/105094901