kotlin 初始化块中的 null 属性

问题描述 投票:0回答:2

我不明白为什么在这段代码中 init{} 块中 i 和 s 的值分别为 0 和 null,但在 B 类的第二个构造函数中这些值是 200 和 param2?

class A(override var i: Int, override var s: String) : B(200, "param2","param3") {
        init {
           println(i)
           println(s)
        }
 }



open class B(open var i: Int, open var s: String) {
    init {
        println("class B init")
        println("i in init B2 is $i")
        println("s in init B2 is $s")
    }


   constructor(i: Int, s: String, s2: String) : this(i, s) {
        println("second constructor B")
        println(" i = $i in second constructor")
        println(" s = $s in second constructor")
        println(" s2 = $s2 in second constructor")
    }

}

    
fun main() {
   val ins2 = A(500, "500S") 
}

结果:

    class B init
    i in init B2 is 0
    s in init B2 is null
    second constructor B
    i = 200 in second constructor
    s = param2 in second constructor
    s2 = param3 in second constructor
    500
    500S

我需要一些解释。

kotlin properties null block init
2个回答
1
投票

该代码中有 2 个警告,都是

Accessing non-final property X in constructor
(一个用于
i
,一个用于
s
)。请阅读此处 Kotlin 在构造函数中调用非最终函数

这就是您首先获得

0
null
的原因。

您得到

200
param2
的原因是因为这就是您在这里告诉它要做的事情
B(200, "param2","param3")

您不是使用

A
中的值创建它,而是使用这些预定义值调用该构造函数。

之后,这些值会被

i
内的
s
A
覆盖。


0
投票

奇怪的是,我发现将属性放置在 init 块之前是有效的。

var thing = ""
init {
    if (thing.isEmpty())
        thing = "something" // this will now work
}
© www.soinside.com 2019 - 2024. All rights reserved.