Init método de inheritance

Si tengo una class abstracta A con un método init:

abstract class A(){ init { println("Hello") } } 

Y luego la class B que se extiende A

 class B(): A() 

Si instalo B como esto

 fun main(args: Array<String>){ B() } 

¿Todavía se ejecuta el método init en A y se imprime Hello ?

Y si no, ¿qué debo hacer para que se ejecute el método init de A?

Sí, se ejecuta un bloque de init de una class base cuando se inicializa la instancia de class derivada.

En Kotlin, de manera similar a Java, una instancia de una class se construye de la siguiente manera:

  1. Un object es asignado.

  2. El constructor de la class se llama. (un)

    1. Si la class tiene una superclass, se llama al constructor de la superclass antes de que se ejecute la lógica de construcción de class ;
      (es decir, el punto (a) se ejecuta recursivamente para la superclass, luego la ejecución continúa desde aquí)

    2. Si la class tiene inicializadores de propiedad o bloques de init , se ejecutan en el mismo order en que aparecen en el cuerpo de la class;

    3. Si el constructor tiene un cuerpo (es decir, es un constructor secundario ), entonces se ejecuta el cuerpo.

En esta descripción, puede ver que, cuando se construye B , se llama al constructor de A antes de que se ejecute la lógica de initialization B , y, en particular, se ejecutan todos los bloques de init de A

(demostración ejecutable de esta lógica)


Un pequeño comentario sobre la terminología: el bloque init no es en realidad un método separado. En su lugar, todos los bloques init junto con los inicializadores de propiedad de miembros se comstackn en el código del constructor, por lo que deberían considerarse como parte del constructor.

  • instancia :: class.java vs. instance.javaClass
  • cómo convertir a NotNull usando enum en Kotlin
  • cómo especificar el order de plugin de comstackdor maven
  • Constructor que toma el constructor plotble en la class derivada de kotlin
  • Enfoque correcto para la class de Kotlin inyectada de constructor inmutable
  • ¿Cómo correctamente serializar tal JSON por medio de GSON Android?
  • Convirtiendo un HashMap usando moshi
  • En la function kotlin android tailrec devuelve 0
  • Polimorfismo en las funciones de extensión en Kotlin
  • Revisión de código La mejor manera de uso ShanetworkingPreferences solving MemoryLeak
  • Kotlin: function abstracta con tipo de retorno genérico