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修饰,次构造函数不能使用它们进行修饰。

· 每个次构造函数需要委托给主构造函数,调用次构造函数时会先调用主构造函数以及初始化块。

所以,类的初始化块、主构造函数、次构造函数的执行顺序为:类的初始化块按先后顺序执行→类的主构造函数→类的次构造函数。