简体   繁体   中英

null properties in init block kotlin

I do not understand why in this code values of i and s are 0 and null respectively in init{} block but in second constructor of class B these values are 200 and 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") 
}

results:

    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

I need some explication please.

You have 2 warnings in that code, both Accessing non-final property X in constructor (one for i and one for s ). Have a read here Kotlin calling non final function in constructor works .

That is the reason you get 0 and null first.

The reason you then get 200 and param2 is because that is what you tell it to do here B(200, "param2","param3") .

You aren't creating it with the values from A , you are calling that constructor with those predefined values.

And afterwards, those values are overwritten by the i and s inside A .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM