Clases y constructores en Kotlin con Android Studio

Antonio Leiva
Antonio Leiva
10 min lectura

Veremos un repaso las clases y constructores de Kotlin para solventar esas inquietudes que nos surgen a la hora de seguir este curso, que pueden ser como funciona realmente y porque se presentan las clases de ese modo, como es la interacción y el constructor a la hora de crear una nueva instancia de clase.

https://www.youtube.com/watch?v=PJG2k0MDK3o

Las clases inicialmente en Kotlin son bastante parecidas a las que podríamos tener en Java. Veremos comparaciones entre ambas para que no quede dude de donde vienen el código que hemos hecho anteriormente.

Como crear una clase en Kotlin

Lo primero es crear el archivo de Kotlin en app > java > com.antonioleiva.androiddesdecero (haciendo click derecho) y le asignamos el nombre de Ejemplo con la primera letra en mayúscula.

Menú contextual New de Android Studio sobre el paquete con la opción Kotlin Class/File seleccionada

Luego crearemos nuestra clase Person y vamos a definir una función fuera de nuestra clase Person que se llame main(), la cual tendrá una variable de p y que a su vez será una instancia de la clase Person. También haremos uso de la función print() para mostrar por pantalla, esto nos quiere decir que nuestro objeto ya existe dentro de nuestro programa.

package com.antonioleiva.androiddesdecero

class Person {
}

fun main() {
    val p = Person()
    print(p)
}

Para poder que se este ejecutando nuestro código anterior, al lado de la función main() aparece una un icono de color verde para ejecutar nuestro código y nos desplegara un consola con el resultado

Ejecución de main en Ejemplo.kt con la consola Run mostrando la instancia Person creada

Constructor en Kotlin

Aquí podemos ver que al momento de crear nuestro objeto de tipo Person, su constructor se encuentra vacío p = Person() pero lo habitual no será que nuestro constructor este vacío, seguramente querremos pasarle un estado, identificar de esa persona cuales son sus atributos. Por ejemplo podríamos definir dos argumentos a nuestro constructor, uno que se sea name y otro que sea age, luego de definir los argumentos le ponemos sus respectivos tipos, String e Int para la edad.

class Person(name: String, age: Int){
}

Si le decimos a esa clase Person que tiene dos argumentos y al momento de instanciar nuestras clase en nuestra variable P y no le pasamos esos datos entonces nos marcara en rojo que hay un error.

Error en Person() porque faltan los argumentos name y age del constructor de la clase Person

Procederíamos a pasarle un nombre y una edad

Instancia de Person creada con el nombre Leonard y la edad 30 como argumentos del constructor

Luego necesitaríamos que nuestra clase guarde este estado en algún sitio, podríamos crearnos un par de propiedades, las propiedades vendrían siendo como los campos de la clase donde podemos guardar el estado. Dentro de la clase definimos

package com.antonioleiva.androiddesdecero

class Person (name: String, age: Int){
    val name = name
    val age = age
}

fun main() {
    val p = Person("Leonard", 30)
    print(p)
}

Si la asignación que le pasamos por el constructor es la misma que la que estamos guardando en la property, no necesitamos definir las propiedades y asignarlas, sino que definimos dentro del constructor antes del nombre con la palabra reservada val

Clase Person con val name y val age declarados directamente en el constructor de Kotlin

Si queremos obtener el nombre que acabamos de guardar en nuestro estado, solo basta con pasarle a nuestra instancia de clase p.name y de este modo obtendríamos el nombre que hayamos definido.

Llamada a print(p.name) y la consola Run mostrando Leonard como resultado

Ahora supongamos que queremos tener un valor por defecto para nuestra propiedad age, ¿Cómo lo haríamos? luego del tipo de argumento que es le asignaremos un valor con el operador ”=” y el valor que queramos.

Person con age = 30 como valor por defecto, instanciada solo con el nombre y la consola mostrando 30

Como crear una clase en Java

Haremos lo mismo que cuando creamos la clase en Kotlin, lo primero es crear el archivo de Java en app > java > com.antonioleiva.androiddesdecero (haciendo click derecho) y le asignamos el nombre de Person2 con la primera letra en mayúscula. Esto nos genera el archivo y de una vez define la clase con el nombre del archivo.

Archivo Person2.java recién creado con la clase Person2 vacía

Luego de tener nuestra clase si queremos tener un código similar al de Kotlin tendríamos que definir nuestras propiedades de la siguiente manera

Clase Person2 en Java con las propiedades públicas name de tipo String y age de tipo int

Por otra parte el constructor en Java se define usando el mismo nombre de la clase y los argumentos que recibirá

Constructor de Person2 en Java que asigna name y age con this

Dentro de nuestro constructor observemos que usamos la palabra reservada this que esta accediendo a nuestras nuestras propiedades que definimos con anterioridad para poder guardar el estado de esas variables y al lado de la igualación obtenemos el valor del argumento que recibe ese constructor.

Dicho esto para que nuestro constructor en Java pueda tener un argumento con un valor por defecto hay que definir otro constructor de la siguiente manera.

Person2 en Java con un segundo constructor que llama a this(name, 30) para dar un valor por defecto a age

Nuevamente vemos la palabra reservada this, que en este caso hace referencia a nuestro constructor que tenemos debajo y que pose dos argumentos, entonces lo que hace es decirle que tomara el argumento con name y el otro al asignarle un valor cuando se instancie nuestra clase se podrá hacer con uno o dos valores.

¿Importancia de Java en Kotlin?

Aunque en nuestro proyecto estemos trabajando en Kotlin todo el framework de Android, todas las APIs de Android están escritas en Java y por tanto tenemos que hacer ciertas cosas para que nuestro código sea compatible con Java. Normalmente no se necesita hacer nada, pero en este caso sí que necesitamos.

Ejemplo MoviewView con Java

Vamos a volver a nuestro proyecto a una de las clases que ya teníamos en la parte del constructor que es nuestra MovieView y generaremos otra pero en Java, y tendrá el mismo nombre pero con el numero 2, sumado a esto heredaremos del LinearLayout con la palabra reservada en Java, extend.

Clase MovieView2 en Java que extiende LinearLayout, marcada con error por no tener constructor

Lo que esta pasando aquí es que no hay un constructor por defecto, ¿Qué tenemos que hacer para solucionar esto? tenemos que crear al menos 3 constructores de los que nos recomiendo el Android Studio, si te fijas en la imagen anterior aparece un bombillo rojo que si le haces click desplegara opciones, le daremos a la que dice .

Sugerencias de Android Studio con la opción Create constructor matching super seleccionada

Diálogo Choose Super Class Constructors con tres constructores de LinearLayout seleccionados

Le damos Ok y nos genera los tres constructores, esto se debe a que:

  • El primer constructor se utiliza cuando estamos creando las clases por código.

  • El segundo se utiliza cuando las clases las escribimos por XML y le estamos pasando un listado de atributos, siempre que añadimos un nuevo atributo al XML, por ejemplo el color de fondo, se va a guardar en este componente.

  • El ultimo porque también en función de los componentes del XML que tenemos vamos a necesitar el tercer argumento

MovieView2 en Java con los tres constructores generados que llaman a super con context, attrs y defStyleAttr

Ejemplo MoviewView con Kotlin

Empezaremos creando otra clase MovieView3 pero con Kotlin para explicar el tema de como definir más de un constructor.

Clase MovieView3 en Kotlin que hereda de LinearLayout, marcada con error por falta de constructor

Recordemos que para heredar en Kotlin hacemos uso de los dos puntos ”:”

Para definir más de un constructor hacemos uso de la palabra reservada constructor() y le pasamos los argumentos que necesitemos.

MovieView3 en Kotlin con tres constructores secundarios que llaman a super

Si bien ya tenemos los constructores para que se parezca a nuestra clase principal MovieView en la que estamos trabajando realmente le hace falta la función init, la cual podremos hacer la definición de 4 formas:

La primera es crear un método que se ejecute dentro de todos los constructores

MovieView3 con tres constructores secundarios que llaman a una función privada init

La segunda forma que es la que usamos en Java usando this para decirle al constructor con cuántos argumentos puede comenzar haciendo referencia al anterior constructor. Si nos fijamos en vez de tener una función init ejecutamos todo dentro del constructor que tiene los tres argumentos.

MovieView3 con constructores encadenados mediante this hasta el constructor de tres argumentos

La tercera forma es en vez de usar los tres constructores usar uno solo, porque los tres anteriores lo que nos dicen es que pueden ser usados con valores por defecto y para ello aprovechamos las ventajas de Kotlin. Agarraremos el ultimo constructor que tiene todos los argumentos y los copiaremos para definir luego de nuestra clase uno solo y a su vez pasarle al padre que es nuestro LinearLayout cuales argumentos estamos usando de el. Por ultimo lo que queremos hacer en el constructor lo hacemos en el bloque init.

MovieView3 con un único constructor primario con valores por defecto y un bloque init

Pero ¿Qué pasa aquí? esto en Kotlin funciona muy bien, tenemos una clase que se puede crear con tres constructores distintos, pero esto tiene que ser utilizado desde Java porque el Framework de Android esta escrito en Java y esto así no va a funcionar…

Si nos vamos en la parte superior de nuestro Android Studio y en la barra de navegación elegimos la opción Tools > Kotlin > Show Kotlin Bytecode nos mostrar lo que este código de Kotlin nos esta generando.

Menú Tools, Kotlin de Android Studio con la opción Show Kotlin Bytecode seleccionada

Este Bytecode vendría siendo las instrucciones que entiende la maquina virtual de Java porque al final es la que va a ejecutar nuestro código dentro de Android.

Panel Kotlin Bytecode de Android Studio con el bytecode generado para MovieView3 y el botón Decompile

Si le damos a donde dice Decompile veremos el equivalente a Java de este código en Bytecode

Código Java descompilado de MovieView3 con un solo constructor público de tres argumentos

Podremos observar que el único constructor que se podrá usar desde Java será le primero, que tiene los tres argumentos, entonces aquí tendríamos un problema, porque si intentáramos usar el resto de constructores desde Java no se podrá usar porque Kotlin usa una forma especial de hacer las cosas.

Entonces, ¿Qué podemos hacer? podemos marcar el constructor con la notación @JvmOverloads esto lo que le dice al compilador es que cuando vaya a generar esta clase, genere todas las distintas sobrecargas de este posible constructor de tal forma que a nivel de Bytecode tengamos las mismas opciones con Java cuando sobre escribamos los tres constructores.

Lo que tenemos que tener que hacer al código que teníamos anteriormente es agregarle lo siguiente:

Constructor primario de MovieView3 anotado con @JvmOverloads

Java descompilado de MovieView3 con los tres constructores generados por @JvmOverloads

Así que con esto ya lo tendríamos listo para usarlo desde Java.

La cuarta forma y ultima para evitar este engorroso proceso es usar las sugerencias del Android Studio al momento de extender de nuestro LinearLayout

Sugerencia de Android Studio Add Android View constructors using @JvmOverloads sobre MovieView3

Y listo nos quedaría así para no tener que hacerlo nosotros

MovieView3 con el constructor @JvmOverloads generado por Android Studio con context y attrs

← Viewgroups

Tutorial Glide →

Laboratorio

Lo último que hemos probado con agentes

Probamos herramientas, modelos y flujos en proyectos reales, y contamos qué funciona y qué no. Sin humo.

Ir al blog
zsh — devexpert

$git log --oneline blog/

$ git show 7bb9632

commit 7bb9632

Autor: Antonio Leiva · 2026-10-19 · 8 min

Claude Code ya lee AGENTS.md, pero solo como plan B. Prueba controlada con una palabra clave por fichero: qué se carga al empezar, qué pasa con las subcarpetas, el global y los cuatro modos del plugin.

$ ▊