¿Cuál es la diferencia entre un bloque init y un constructor en Kotlin?
¡Hola! Acabo de empezar a aprender Kotlin después de Java y me encontré con confusión. En Java tenemos constructores donde inicializamos campos. En Kotlin veo que se pueden usar tanto constructores (primario y secundarios) como bloques especiales `init`. Pero no termino de entender para qué sirven los bloques `init` si todo se puede hacer en el constructor.
Por ejemplo, tengo este código:
```kotlin
class Person(name: String) {
val name: String
init {
this.name = name.uppercase()
}
}
```
¿Por qué no simplemente escribir `init` en el cuerpo del constructor, como en Java? O también este ejemplo:
```kotlin
class Rectangle(val width: Int, val height: Int) {
val area: Int
init {
area = width * height
}
}
```
¿Se puede hacer esto directamente en el constructor primario? ¿Cuál es la diferencia fundamental entre `init` y el constructor? ¿Cuándo usar cada uno? ¿Y qué pasa si la clase tiene varios bloques `init` y constructores secundarios? ¿En qué orden se ejecutan?