kir*_*403 4 constructor initialization class init kotlin
我最近遇到了一种情况,即使我使用 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"
Run Code Online (Sandbox Code Playgroud)
经过一番挣扎,我发现 init 块的位置很重要。如果我将 init 块放在类的最后一个,它首先使用默认名称初始化名称,然后调用 function() 将值替换为“新名称”。
如果我把它放在第一位,它没有找到名称,并且在初始化属性时将其替换为“默认名称”。
这对我来说很奇怪。谁能解释为什么会这样?
sas*_*mar 11
原因是 kotlin 遵循自上而下的方法
从文档(深入了解 Kotlin 的初始化器)中,初始化器(属性初始化器和 init 块)按照它们在类中定义的顺序执行,从上到下。
您可以定义多个辅助构造函数,但在创建类实例时只会调用一个,除非构造函数显式调用另一个。
构造函数也可以有默认参数值,每次调用构造函数时都会评估这些值。与属性初始值设定项一样,它们可以是函数调用或将运行任意代码的其他表达式。
初始化器在类的主构造函数的开头从上到下运行。
这是正确的方法
class Example(function: Example.() -> Unit) {
var name = "default name"
init {
function()
}
}
Run Code Online (Sandbox Code Playgroud)