Kotlin-构造函数(3)- init代码块

场景,通过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代码块跟主构造函数搭配使用的,或者做一些跟次构造函数无强相关的处理。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容