kotlin的主构造函数, 次构造函数, init代码块, 伴生对象的执行顺序, 特点, 使用场景, 及跟java的比较
目录
kotlin的主构造函数, 次构造函数, init代码块, 伴生对象的执行顺序, 特点, 使用场景, 及跟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
转载:https://blog.csdn.net/guyue35/article/details/105097609
查看评论