
上QQ阅读APP看书,第一时间看更新
2.2.1 构造函数和初始化块
在Kotlin中,类的构造函数可以包括一个主构造函数和N个次构造函数。
1.主构造函数
Kotlin的主构造函数可以借助初始化块对代码进行初始化。Kotlin使用init关键字作为初始化块的前缀。

对上述代码进行反编译后会发现,init初始化块的代码会包含在无参数的构造函数中,如图2-3所示。

图2-3 init初始化块反编译后
上述Kotlin代码等价于使用constructor关键字作为构造函数的函数名,不过此时可以省略函数名。

主构造函数的特性:
· 主构造函数可以省略constructor,无论在主构造函数中是否包含参数。
· 初始化块可以有多个,调用主构造函数时会按照初始化块的顺序执行。
2.次构造函数
Kotlin的次构造函数同样使用constructor作为函数名,但不能省略函数名。次构造函数可以包含代码,调用次构造函数时必须调用主构造函数,这一点非常重要。

执行结果如下:
hello hello world this is foo function
如果类中出现多个初始化块,就会按照顺序依次执行。实际上,多个初始化块的代码会按照顺序合并到主构造函数中。

执行结果:
hello1 hello2 hello3 hello world this is foo function
通过反编译上述代码,能够更清晰地了解次构造函数的调用方式,如图2-4所示。

图2-4 次构造函数反编译后
次构造函数的特性:
· 类可以拥有多个次构造函数。
· 主构造函数的属性可以使用var、val修饰,次构造函数不能使用它们进行修饰。
· 每个次构造函数需要委托给主构造函数,调用次构造函数时会先调用主构造函数以及初始化块。
所以,类的初始化块、主构造函数、次构造函数的执行顺序为:类的初始化块按先后顺序执行→类的主构造函数→类的次构造函数。