场景,通过Person("yang", 30)创建实体,doSomething方法是否会执行呢?
// 定义
class Person {
private var name: String? = null
private var age: Int? = null
constructor(name: String, age: Int) {
this.name = name
this.age = age
}
init {
if (!this.name.isNullOrEmpty()) {
doSomething()
}
if (this.age != null) {
doSomething()
}
}
}
//调用Person("yang", 30)
- doSomething方法不会被执行。是否跟大家像的有点不一样呢?反正是我搞错了的。
如果你答对了,以下内容可以跳过了,答错了的可以继续往下看。
这个问题的关键在于对init代码块执行顺序的理解,执行顺序:主构造函数->init代码块->次构造函数,次构造函数是晚于init代码块执行的,constructor(name: String, age: Int)是次构造函数,而非主构造函数,只有定义在类名后面的才是主构造函数。当执行到init代码块的时候,属性是没有值的。
如果希望doSomething函数得到执行,可以把构造函数定义为主构造函数。
class Person constructor(val name: String?, val age: Int?) {
init {
if (!this.name.isNullOrEmpty()) {
doSomething()
}
if (this.age != null) {
doSomething()
}
}
}
总结:
- init代码块跟主构造函数搭配使用的,或者做一些跟次构造函数无强相关的处理。
以上分析有不对的地方,请指出,互相学习,谢谢哦!
网友评论