Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class Kotlin中类中的初始块位置_Class_Constructor_Initialization_Kotlin_Init - Fatal编程技术网

Class Kotlin中类中的初始块位置

Class Kotlin中类中的初始块位置,class,constructor,initialization,kotlin,init,Class,Constructor,Initialization,Kotlin,Init,我最近遇到了一种情况,我的标准变量的值被默认值替换,即使我使用init block为构造函数赋值 我尝试的是: class Example(function: Example.() -> Unit) { init { function() } var name = "default name" } // assigning it like this: val example = Example { name = "new name" }

我最近遇到了一种情况,我的标准变量的值被默认值替换,即使我使用init block为构造函数赋值

我尝试的是:

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块放在类的最后一个位置,它会首先用默认名称初始化名称,然后调用函数(),用“新名称”替换该值

如果我把它放在第一位,它找不到名称,当属性初始化时,它被替换为“默认名称”


这对我来说很奇怪。有人能解释为什么会发生这种情况吗?

原因是科特林采用了自上而下的方法

从documents()开始,初始值设定项(属性初始值设定项和init块)按照类中定义的顺序从上到下执行

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

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

初始值设定项在类的主构造函数开头自上而下运行

这是正确的方法

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

如Kotlin文件所述:

在实例初始化过程中,初始值设定项块以与类主体中出现的相同顺序执行,与属性初始值设定项交织在一起:


类初始化是自上而下的,初始化块不能免除。这个练习仅仅是为了理解Kotlin初始化吗?如果没有,您可以通过
类示例(val name:String=“default name”)
实现这一点。我试图在我的库()中执行此操作,但在将其放在顶部之后,整个功能就中断了。签出将init块放在底部在大多数情况下都有意义吗?除非你有特殊需要。。。