Tipos de datos, variables y constantes

Básico
Kotlin
Kotlin
Actualizado: 04/05/2026

Diagrama: tutorial-kotlin-tipos-datos-variables-constantes

Jerarquía de tipos en Kotlin 2.1

En Kotlin todos los valores son objetos: Int, Double o Boolean no son primitivos como en Java sino instancias de clases que el compilador puede optimizar a primitivos cuando es posible. La jerarquía está coronada por Any y cerrada con Nothing, y cada tipo tiene su variante nullable (T?) en una rama paralela. Encima de Any no nullable se sitúa Any?, raíz nullable, y por debajo Nothing actúa como subtipo de todos los tipos, lo que permite que throw o return se acepten en cualquier expresión.

Bajo Any cuelgan Number (con Byte, Short, Int, Long, Float y Double), Boolean, Char (UTF-16), CharSequence con String como implementación inmutable y Unit para funciones sin valor útil. Cada tipo dispone además de su versión nullable (Int?, String?, etc.) que el compilador trata como un tipo distinto.

Declaración y asignación de variables

En Kotlin, para declarar una variable, se utilizan las palabras clave var y val. La diferencia entre ambas radica en la mutabilidad: var declara una variable mutable cuyo valor puede cambiar, mientras que val declara una variable inmutable que, una vez asignada, no puede modificarse.

Ejemplo de declaración mutable:

var edad: Int = 25

En este caso, edad es una variable mutable de tipo Int inicializada con el valor 25. Al ser mutable, es posible cambiar su valor posteriormente:

edad = 26

Por otro lado, una declaración inmutable se realiza con val:

val nombre: String = "María"

Aquí, nombre es una variable inmutable de tipo String. Intentar modificar su valor generaría un error de compilación:

nombre = "Ana" // Error: Val cannot be reassigned

Kotlin cuenta con inferencia de tipos, lo que permite omitir la especificación del tipo si este puede deducirse a partir del valor asignado:

val pi = 3.1416

En este ejemplo, pi será de tipo Double debido al valor asignado. Sin embargo, en situaciones donde el tipo no es evidente o para mayor claridad, es recomendable especificarlo explícitamente.

Es importante inicializar las variables al declararlas, ya que Kotlin requiere que se les asigne un valor inicial. No obstante, es posible declarar variables sin valor inicial utilizando tipos anulables o inicialización tardía con lateinit para variables mutables y lazy para inmutables, aunque estas son características más avanzadas.

Los nombres de las variables deben seguir las convenciones de nomenclatura de Kotlin: comenzar con una letra o guion bajo, seguidos de letras, dígitos o guiones bajos. Además, es buena práctica utilizar nombres descriptivos que reflejen su propósito en el código.

Tipos básicos (números, carácter y booleano)

En Kotlin, los tipos numéricos y Boolean cubren valores básicos como números y booleanos. En la JVM suelen representarse como tipos primitivos cuando el compilador puede hacerlo, lo que ayuda al rendimiento sin dejar de ofrecerte una API orientada a objetos.

Números enteros

Para trabajar con números enteros, Kotlin ofrece cuatro tipos principales, diferenciados por el rango de valores que pueden almacenar:

  • Byte: representa números enteros de 8 bits con signo. Rango: de -128 a 127.
  • Short: representa números enteros de 16 bits con signo. Rango: de -32,768 a 32,767.
  • Int: representa números enteros de 32 bits con signo. Rango: de -2,147,483,648 a 2,147,483,647.
  • Long: representa números enteros de 64 bits con signo. Rango: de -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807.

Ejemplos:

val edad: Int = 30
val distancia: Long = 9_223_372_036_854_775_807L

Es importante notar que para declarar un Long literal, se utiliza la letra L al final del valor. Además, Kotlin permite usar guiones bajos para separar cifras y mejorar la legibilidad.

Números de coma flotante

Para representar números con decimales, Kotlin dispone de:

  • Float: representa números de coma flotante de 32 bits. Se utiliza para valores con menos precisión.
  • Double: representa números de coma flotante de 64 bits. Es el tipo por defecto para valores decimales.

Ejemplos:

val pi: Double = 3.1415926535
val euler: Float = 2.7182818F

Al asignar un literal Float, se añade la letra F al final del número. Sin embargo, los literales decimales sin sufijo se interpretan como Double por defecto.

Caracteres

El tipo Char se utiliza para representar un único carácter Unicode. Los valores de tipo Char se delimitan con comillas simples.

Ejemplo:

val inicial: Char = 'A'

Los caracteres pueden representar letras, dígitos o símbolos especiales. Además, es posible utilizar secuencias de escape como \n para un salto de línea o \uFFFF para un carácter Unicode específico.

Booleanos

El tipo Boolean solo puede tener dos valores posibles: true o false. Se utiliza para representar condiciones lógicas y controlar el flujo del programa.

Ejemplo:

val esAdulto: Boolean = true

Los booleanos son fundamentales en estructuras de control como condiciones if, bucles y operadores lógicos.

Literales numéricos

Kotlin ofrece diversas formas de representar literales numéricos:

  • Binarios: se antepone 0b al valor. Ejemplo: val binario = 0b1010
  • Hexadecimales: se antepone 0x al valor. Ejemplo: val hexadecimal = 0xFF
  • Separadores de dígitos: se pueden usar guiones bajos para mejorar la legibilidad. Ejemplo: val millon = 1_000_000

Conversión entre tipos

Para convertir entre tipos numéricos, se utilizan funciones explícitas de conversión, ya que Kotlin no realiza conversión implícita entre tipos más pequeños y más grandes.

Ejemplo:

val numeroInt: Int = 100
val numeroLong: Long = numeroInt.toLong()

Las funciones de conversión más comunes son: toByte(), toShort(), toInt(), toLong(), toFloat(), toDouble() y toChar().

Inmutabilidad y valores básicos

Aunque puedas reasignar variables var que contienen números o booleanos, conviene usar val cuando el valor no deba cambiar.

Ejemplo:

val gravedad: Double = 9.80665

La inmutabilidad es un principio que ayuda a prevenir errores y hacer que el código sea más predecible.

Resumen

Estos tipos son la base para manejar datos simples en Kotlin. Comprender sus rangos y conversiones explícitas es esencial para escribir código eficiente y seguro.

Uso de constantes

En Kotlin, una constante es un valor que no cambia durante la ejecución del programa y que se conoce en tiempo de compilación. Para declarar constantes, se utiliza la palabra clave const antes de val, formando const val. Estas constantes deben ser variables inmutables cuyo valor se asigna en tiempo de compilación y no puede modificarse posteriormente.

Ejemplo de declaración de una constante:

const val PI = 3.1416

En este caso, PI es una constante de tipo Double cuyo valor es 3.1416. Al ser declarada con const val, su valor se conoce en tiempo de compilación y puede usarse en contextos donde se requiera un valor constante, como anotaciones o inicializadores de otras constantes.

Es importante distinguir entre val y const val. Mientras que val declara una variable inmutable cuyo valor se asigna en tiempo de ejecución, const val se utiliza para valores que se conocen en tiempo de compilación. Por ejemplo:

val fechaActual = obtenerFecha() // Valor asignado en tiempo de ejecución

Aquí, fechaActual es inmutable, pero su valor se obtiene durante la ejecución del programa, no en tiempo de compilación. Por lo tanto, no puede ser declarada con const val.

Las constantes solo pueden basarse en tipos admitidos como constantes de compilación (String y tipos numéricos y booleanos básicos, entre otros casos de la documentación oficial). No puedes usar instancias de clases arbitrarias definidas por ti.

Ejemplos adicionales de constantes:

const val MAX_INTENTOS = 5
const val MENSAJE_BIENVENIDA = "Bienvenido al sistema"

En el primer ejemplo, MAX_INTENTOS es una constante entera que podría usarse para limitar el número de intentos en un proceso. En el segundo, MENSAJE_BIENVENIDA es una constante de tipo String utilizada para mostrar un mensaje al usuario.

Las constantes deben declararse a nivel superior, dentro de un object o de un companion object. No pueden declararse dentro de funciones ni como miembros de instancia ordinarios. Deben resolverse en tiempo de compilación.

Ejemplo de constante dentro de un objeto:

object Configuracion {
    const val URL_BASE = "https://api.ejemplo.com/"
}

Aquí, URL_BASE es una constante accesible a través del objeto Configuración. Este patrón es útil para agrupar configuraciones o valores constantes relacionados.

Al utilizar constantes, se mejora la legibilidad y mantenibilidad del código, ya que se evitan números mágicos o cadenas repetidas dispersas en el código. Además, facilita la actualización de valores que pueden cambiar en el futuro, centralizándolos en una única declaración.

Es importante evitar la confusión entre val y const val. Aunque ambas formas declaran valores inmutables, solo const val define una constante de tiempo de compilación. Usa val cuando el valor se fija en ejecución.

Un punto a considerar es que las constantes no pueden asignarse a valores que resulten de llamadas a funciones o cálculos en tiempo de ejecución. Por ejemplo, no es posible hacer lo siguiente:

const val TIEMPO_EJECUCION = System.currentTimeMillis() // Error de compilación

Este código generaría un error, ya que System.currentTimeMillis() se evalúa en tiempo de ejecución, no en tiempo de compilación. En este caso, se debe utilizar val en lugar de const val.

En resumen, las constantes en Kotlin proporcionan una forma segura y eficiente de manejar valores inmutables conocidos en tiempo de compilación, mejorando la consistencia y claridad del código. Es recomendable utilizarlas siempre que sea posible para valores fijos que no cambian durante la ejecución del programa.

Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Kotlin es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de Kotlin

Explora más contenido relacionado con Kotlin y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

  • Comprender la diferencia entre var y val en Kotlin.
  • Declarar variables utilizando inferencia de tipos.
  • Conocer los tipos numéricos básicos y sus rangos en Kotlin.
  • Aprender a utilizar literales numéricos, caracteres y booleanos.
  • Convertir tipos numéricos explícitamente en Kotlin.
  • Declarar constantes de tiempo de compilación con const val.