问题背景
kotlin的类初始化过程,经常涉及到主构造函数、次构造函数、init函数,那么类初始化过程,他们的执行顺序是什么呢?
问题分析
首先,我们看下主构造函数、次构造函数、init函数分别指啥?
(1)主构造函数
主构造函数是类标头的一部分。比如以下实例:
class Person(val name: String, var age: Int) {
}
用括号括起来的代码块是主要的构造函数:(val name: String, var age: Int)。 构造函数声明了两个属性:name(只读属性,因为它是使用关键字val声明的)和age(读写属性,因为它是用关键字var声明的)。 查看主构造函数对应的java反编译代码如下(具体反编译方法可参考 https://blog.51cto.com/baorant24/6034450 (2)中介绍)):
(2)次构造函数
在Kotlin中,一个类还可以包含一个或多个次构造函数。它们是使用 constructor 关键字创建的。可以在Kotlin中创建次构造函数的方法如下:
class Log {
constructor(data: String) {
// 一些代码
}
constructor(data: String, numberOfData: Int) {
// 一些代码
}
}
查看对应的java反编译代码:
(3)init函数
在 Kotlin 类中 , 可以定义 init 初始化块 , 在其中可以为 变量赋值 , 执行一些检查相关的代码 , 该 init 初始化块在 创建类实例对象 时执行,代码示例如下:
(4)类初始化顺序
Kotlin 类 对象在实例化 时会执行一系列的 初始化操作 , 反编译java代码看看,这些操作执行的顺序 : 可以看出这些操作按照如下顺序执行 : 主构造函数 中属性赋值 类中的属性赋值 init 初始化块 中的代码执行 次构造函数 中的代码执行
问题总结
针对kotlin类结构中的主构造函数、次构造函数、init函数等,本文给与了初步介绍,同时通过反编译java代码的方式,清晰说明了类初始化过程的执行顺序,有兴趣的同学可以进一步深入研究。