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.

  • ¿Existe un equivalente de Kotlin para la biblioteca AssertJ?
  • Código automático Kotlin llamando en el patrón de delegación
  • window.reload en Webview
  • ¿Cómo iniciar dos constructores en kotlin con class interna?
  • ¿Cuál es la diferencia entre var name: String? y var nombre: Cadena
  • Kotlin - No coincide el tipo: Obligatorio: Cadena, Encontrado: () -> Cadena
  • ¿Cómo recuperar todos los documentos de la colección Firestre en la class POJO?
  • Crear una class de reloj digital usando Kotlin
  • ¿Cuál es la forma correcta de configurar y generar una database con datos artificiales para testings de integración?
  • No puedo gradle proyecto de construcción cuando agrego la class ChatInformation kotlin que extiende RealmObject a mi proyecto, ¿dónde está el error?
  • ¿Hay alguna diferencia entre "object receptor" y "receptor de extensión"