1、先说结论:
主构造函数
-->init代码块
-->次构造函数
2、主构造函数和次构造函数
以下代码,通过调用次构造函数实例化对象。观察输出日志,执行次构造函数时,nameT已经有值,所以可以得知主构造函数先于次构造函数执行。这里要把var nameT: String = name当成主构造函数的一部分。
//主构造函数
class Demo2(name: String) {
//主构造函数的一部分
var nameT: String = name
//次构造函数
constructor(name: String, age: Int) : this(name) {
println("nameT=${nameT}")
println("secondary constructor")
}
}
//----main 中调用----
Demo2("yang",18)
//----日志输出----
nameT=yang
secondary constructor
3、主构造函数和init
以下代码,通过调用主构造函数实例化对象。观察输出日志,执行init代码块时,nameT已经有值,所以主构造函数先于init代码块执行。这里同样要把var nameT: String = name当成主构造函数的一部分。
class Demo2(name: String) {
var nameT: String = name
init {
println("nameT=${nameT}")
println("int")
}
}
//调用
Demo2("yang")
//日志输出
nameT=name2
int
4、次构造函数和init
以下代码,通过调用次构造函数实例化对象。观察输出日志,可以得知init代码块先于次构造函数执行。class Demo2{
constructor(name: String, age: Int) {
println("secondary constructor")
}
init{
println("init")
}
}
//调用
Demo2("yang",18)
//日志输出
init
secondary constructor
5、总结
主构造函数执行优先级最好、init代码块次之、次构造函数执行优先级最低。
网友评论