Kotlin在声明之前初始化变量?

Ebn*_*ang 18 constructor initialization declaration kotlin

这是我的测试代码:

class Test {
    init {
        a = 1
    }

    constructor() {
        a = 2
    }

    private var a: Int

    init {
        a = 3
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我删除辅助构造函数:

class Test {
    init {
        a = 1 // Error: Variable cannot be initialized before declaration
    }

//    constructor() {
//        a = 2
//    }

    private var a: Int

    init {
        a = 3
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道

在实例初始化期间,初始化程序块的执行顺序与它们在类主体中出现的顺序相同.

但是,如果存在辅助构造函数,为什么我可以在声明之前初始化变量?


更新:

我发现了一件有趣的事:

class Test {
    init {
        a = log(1)
    }

    constructor() {
        a = log(2)
    }

    private var a: Int = log(0)

    init {
        a = log(3)
    }
}

fun log(i: Int): Int {
    println(i)
    return i
}

fun main(args: Array<String>) {
    Test()
}
Run Code Online (Sandbox Code Playgroud)

输出是:1 0 3 2,这与Java相同,声明和初始化是两个不同的步骤,但这对于Kotlin的主要构造函数来说很奇怪,Er ...

小智 0

你的例子看起来有点不一致。这是因为第一个示例没有主构造函数,但第二个示例有一个。但是,https://youtrack.jetbrains.com/issue/KT-22317已创建。