场景,通过Person("yang", 30)创建实体,doSomething方法是否会执行呢?
代码定义Person数据结构,在init代码块中,如果属性有值则执行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方法不会被执行。是否跟大家像的有点不一样呢?反正是我搞错了的。 如果你答对了,那么以下内容跳过了,答错了的可以继续往下看。 这个问题的关键在于对主、次构造函数的理解,其实以上代码定义的Person是没有主构造函数的,只有一个次构造函数。次构造函数是晚于init代码块执行的,如果错误的认为那个函数就是主构造函数,就会出现答错的情况。
主构造函数,只有定义在类名后面的才是主构造函数,最多只有1个,可以没有;
次构造函数,在类内定义的都是次构造函数,可以有多个;
执行顺序,主构造函数->init代码块->次构造函数。
如果希望属性有值则执行doSomething方法,可以把构造函数定义为主构造函数。
class Person constructor(val name: String?, val age: Int?) {
init {
if (!this.name.isNullOrEmpty()) {
doSomething()
}
if (this.age != null) {
doSomething()
}
}
}
总结:
- 只有定义在类名后的才是主构造函数,最多只有1个,可以没有;
- 定义在类内的都是次构造函数,可以有多个;
- 执行顺序:主构造函数->init代码块->次构造函数;
以上分析有不对的地方,请指出,互相学习,谢谢哦!