when que lazy lateinit example companion constructor initialization kotlin declaration

constructor - que - ¿Kotlin inicializa una variable antes de su declaración?



lateinit kotlin que es (3)

Aquí está mi código de prueba:

class Test { init { a = 1 } constructor() { a = 2 } private var a: Int init { a = 3 } }

Si elimino el constructor secundario:

class Test { init { a = 1 // Error: Variable cannot be initialized before declaration } // constructor() { // a = 2 // } private var a: Int init { a = 3 } }

Yo sé eso

Durante una inicialización de instancia, los bloques de inicialización se ejecutan en el mismo orden en que aparecen en el cuerpo de la clase.

Pero, ¿por qué puedo inicializar la variable antes de su declaración si hay un constructor secundario?

Actualizar:

Y encontré algo interesante:

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() }

La salida es: 1 0 3 2 , esto es igual que Java, la declaración y la inicialización son dos pasos diferentes, pero eso es extraño para el constructor primario de Kotlin, Er ...


Desde mi punto de vista, se relaciona no con kotlin sino con el código de bytes JVM que en realidad no tiene "inicialización" de las variables, solo las llena en el constructor, puede inspeccionarlo con un descompilador.


Esto se está expandiendo a partir del comentario de Michael que se refiere a la documentación de Kotlin :

Tenga en cuenta que el código en los bloques de inicialización se convierte efectivamente en parte del constructor primario. La delegación al constructor primario ocurre como la primera declaración de un constructor secundario , por lo que el código en todos los bloques de inicialización se ejecuta antes que el cuerpo del constructor secundario. Incluso si la clase no tiene un constructor primario, la delegación todavía ocurre implícitamente y los bloques de inicialización aún se ejecutan.

En otras palabras, los bloques init() se asocian al constructor primario (implícito), que se ejecuta como la primera línea de su constructor secundario. -Kf