当我们想要对类的一些属性进行初始化时,可以有几种方式进行初始化:
在主构造函数里初始化
在声明时初始化
在次构造函数里初始化
在初始化块里初始化
既然有这么多方式,同一属性就有可能在多个初始化的地方被引用,所以初始化代码的执行顺序就尤其重要。我们可以通过反编译Java字节码来研究下类属性初始化顺序:
看下反编译成java字节码是怎样的:
汇总上图信息,可以得到以下初始化顺序。
(1) 主构造函数里声明的属性( val health: Int)
(2) 类级别的属性赋值( val race = "DWARF", val town = "Bavaria", val name = _name)
(3) init 初始化块里的属性赋值和函数调用( alignment = "GOOD"、 println 函数)
(4) 次构造函数里的属性赋值和函数调用( town = "The Shire")
需要说明的是, init 初始化块和类级别的属性赋值的顺序取决于定义的先后。如果 init 初始化块定义在类级别的属性赋值之前,那么它就比类级别的属性赋值早一步初始化。