Kotlin-构造函数(3)-主构造函数

106 阅读1分钟
场景,通过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代码块->次构造函数;

以上分析有不对的地方,请指出,互相学习,谢谢哦!