初始块位置在Kotlin上课

我最近遇到了一种情况,我的标准variables的值被默认值所替代,即使我已经使用init块的构造函数赋值了。

我试过的是:

class Example(function: Example.() -> Unit) { init { function() } var name = "default name" } // assigning it like this: val example = Example { name = "new name" } // print value print(example.name) // prints "default name" 

在挣扎了一下之后,我发现init块的位置很重要。 如果我把init块放在类的最后一个,它首先用缺省值初始化名称,然后调用用“new name”替换值的函数()。

如果我把它放在第一,它没有find名称,它被替换为“默认名称”时,属性被初始化。

这对我来说很奇怪 任何人都可以解释为什么发生这种事

原因是kotlin遵循自上而下的方法

从文档( 深入研究Kotlin的初始化器 ),初始化器(属性初始化器和初始化块) 按从上到下的顺序执行。

您可以定义多个辅助构造函数,但只有一个构造函数会在您创建类实例时调用,除非构造函数显式调用另一个构造函数。

构造函数也可以具有默认的参数值,每次调用构造函数时都会对其进行评估。 像属性初始值设定项一样,这些可以是函数调用或其他将运行任意代码的expression式。

初始化器在类的主构造函数的开始处从上到下运行。

这是正确的方法

 class Example(function: Example.() -> Unit) { var name = "default name" init { function() } }