Las variables en Java

En este post, voy a hablar de las variables en Java. Explicaré como declararlas e inicializarlas, los tipos de variables primitivos que manejamos en Java, como cambiar el tipo de una variable y el alcance de esta.

Pero antes de empezar, hay que introducir una serie de conceptos preliminares:

  • Una variable es un contenedor, una localización de memoria, que almacena un valor mientras se ejecuta un programa.
  • Ponemos un nombre a cada variable, de forma que podamos referenciarla en nuestro código, y usar el valor que almacena.
  • Las variables son de un tipo. El tipo de datos que pretendemos almacenar en dicha variable. Por ejemplo, si una variable es del tipo int, se empleara para guardar valores de números enteros. Sin embargo, si es del tipo String, se emplea para guardar una cadena de caracteres, es decir, texto.
  • Las variables tienen que ser declaradas. En dicha declaración indicamos el tipo de la variable y su nombre.
  • Una variable tiene que ser inicializada para poder ser usada en nuestro programa. Inicializar una variable es poner un valor en ella.

Declarando e inicializando variables

Para declarar una variable tenemos que indicar el tipo y el nombre. Algunos ejemplos:

int mes;
String mensaje;

“int” es un tipo primitivo mientras que String no lo es. El tipo String es en realidad una cadena de caracteres. Un carácter se almacenaría en un tipo char que si es un tipo primitivo de java.

Practiquemos con un ejemplo:

Ejercicio 1: Declarando e inicializando variables

  1. Abre el compilador online:
  2. Introduce el siguiente código:
public class HelloWorld{

     public static void main(String []args){

                String mensaje;

                 mensaje = "Hello World";

        System.out.println(mensaje);

     }  

}

Línea 3: la variable mensaje es declarada del tipo String.

Línea 4: la variable mensaje es inicializada con el valor: “Hello World”.

Línea 5: Instrucción para pintar en pantalla el texto almacenado en la variable mensaje.

Ejercicio 2: Declarando e inicializando variables

  1. Abre el compilador online:
  2. Introduce el siguiente código:
public class HelloWorld{

     public static void main(String []args){

        int numero1, numero2, suma;

        numero1 = 11;

        numero2 = 7;

        suma = numero1 + numero2;

        System.out.println(suma);

     }  

}

Línea 3: variables numero1, numero2 y suma son declaradas como tipo integer, con el identificador int.

Líneas 4 y 5: Inicializamos las variables numero1 y numero2

Línea 6: ejecutamos la operación suma con los valores de las variables numero1 y numero2, guardando el resultado obtenido en la variable suma

Línea 7: Presentamos en pantalla el valor de la variable suma

Tipos primitivos

Java define algunos tipos de datos conocidos como tipos primitivos. Sin embargo, existen otro tipo de datos llamados tipos referenciados, que son creados por el programador.

En este cuaderno estudiaremos los tipos primitivos.

TipoExplicación
intNúmeros enteros (4 bytes)
shortNúmeros enteros (2 bytes)
longNúmeros enteros (8 bytes)
byteNúmeros enteros (1 bytes)
floatNúmeros decimales de coma flotante (4 bytes)
doubleNúmeros decimales de coma flotante (8 bytes)
charCaracteres usando el esquema de codificación Unicode (2 byte)
booleanValor binario: verdadero o falso.
Los 8 tipos primitivos de Java

De los 8 tipos primitivos de Java, 6 son numéricos. Practiquemos con los distintos tipos.

Ejercicio 3: Practicando con tipos primitivos

  1. Abre el compilador online:
  2. Introduce el código de la actividad previa:
public class HelloWorld{

     public static void main(String []args){

        int numero1, numero2, suma;

        numero1 = 11;

        numero2 = 7;

        suma = numero1 + numero2;

        System.out.println(suma);

     }  

}

En la línea 3: las variables numero1, numero2 and suma son declaradas como números enteros y todo funciona correctamente.

  1. Ahora cambiamos el operador de suma por el de división. En la línea 6: Cambiar “+” por “/”

El resultado de dividir 11 entre 7, es 1, lo que no es completamente exacto. Obtenemos este resultado porque la variable suma es de tipo int, y no admite un valor decimal.

  1. Cambia el tipo de la variable “suma” de int a float.

El nuevo código sería:

public class HelloWorld{

     public static void main(String []args){

         int numero1, numero2;

         float suma;

        numero1 = 11;

        numero2 = 7;

        suma = numero1 / numero2;

        System.out.println(suma);

     }

}
  1. Ejecuta el programa
  2. El resultado es “1.0”. Lo que no es exacto, pero está expresado en un número decimal.

El resultado de una operación entre dos números enteros será siempre un valor entero. Si lo guardamos en una variable float, este valor será transformado a un número decimal, pero recuerda que el resultado de la operación fue un número entero.

  1. Cambiamos ahora los tipos de las variables “numero1” y “numero2” de int a float.

Podemos declarar todas las variables del tipo float en la misma línea, quedando el siguiente código:

public class HelloWorld{

     public static void main(String []args){

         float numero1, numero2, suma;

        numero1 = 11;

        numero2 = 7;

        suma = numero1 / numero2;

        System.out.println(suma);

     }

}

Ahora el resultado es: 1,5714285. Así que finalmente obtenemos el resultado exacto cuando declaramos todas las variables con un tipo que admita números decimales.

  1. Cambiamos ahora el tipo de la variable “suma” de float a int

Separamos la line 3 en dos líneas de declaración de variables:

float numero1, numero2,

int suma;

  1. Ejecutamos el programa y obtendremos el error:
/HelloWorld.java:7: error: incompatible types: possible lossy conversion from float to int

        suma = numero1 / numero2;                        ^1 error

¿Qué ha ocurrido? La respuesta es que la división entre numero1 y numero2 es un valor float, es decir, un número decimal. Cuando intentamos almacenar un valor decimal en una variable que solo admite números enteros, obtenemos el consiguiente error.

Ahora practiquemos con el tipo char

Ejercicio 4: Practicando con el tipo char

  1. Abre el compilador online:
  2. Introduce el siguiente código:
public class HelloWorld{

     public static void main(String []args){

        char character;

        character = 'C';

        System.out.println(character);

     }

}

En la línea 3: declaramos la variable character de tipo char.

En la línea 4: Iniciamos la anterior variable. Nota que el valor que queremos guardar en la variable, al ser de tipo char, tiene que ir entre comillas simples. Así es la nomenclatura de java.

En la línea 5:  Pintamos el valor de la variable en pantalla.

  1. Ahora probamos a cambiar las comillas simples por dobles en la inicialización de la variable. Hacemos character = «C»;
  2. Ejecutamos el programa y obtenemos el siguiente error:
/HelloWorld.java:4: error: incompatible types: String cannot be converted to char

        character = "C";                     ^1 error
  1. Recuerda, java es un lenguaje con una sintaxis muy estricta. Cuando inicialicemos una variable tipo char tendremos que usar comillas simples. Cuando inicialicemos un String utilizaremos comillas dobles.
  2. Teclea ahora el Código siguiente:
public class HelloWorld{

     public static void main(String []args){

        char character1, character2;

        character1 = 'H';

        character2='i';

        System.out.print(character1);

        System.out.print(character2);

     }

}
  1. Ejecuta el programa y dibujaras la palabra inglesa Hi en la pantalla.

Hemos usado un nuevo método para escribir: “print” en lugar de “println”. La diferencia radica en que el ultimo método nos mueve a una línea nueva después de dibujar su argumento. El primero sin embargo no lo hace, por lo que usando este método dibujamos los caracteres seguidos.

Secuencias de escape

En java, disponemos de una serie de secuencias de escape:

Secuencia de escapeExplicación
\bRetroceso
\tTabulador horizontal
\nSalto de línea
\fSalto de formulario
\rRetorno de carro
\”Comilla doble
\’Comilla simple
\\Barra invertida
Tabla de secuencias de escape en Java

Para entender cómo funcionan las secuencias de escape, lo mejor es verlo en una práctica.

Ejercicio 5: Practicando con las secuencias de escape

  1. Abre el compilador online:
  2. Introduce el siguiente código:
public class HelloWorld{

     public static void main(String []args){

        char character1, character2,character3;

        character1 = 'H';

        character2='\n';

        character3='i';

        System.out.print(character1);

        System.out.print(character2);

        System.out.print(character3);

     }

}
  1. Ejecuta el programa y veras el efecto de la secuencia de escape, en este caso “\n”, que genera una nueva línea.
  2. Entonces las líneas 7,8 y 9, serían equivalente a:

System.out.println(character1);

System.out.print(character3);

Finalmente, nos queda un último tipo primitivo por analizar: el boolean. Una variable booleana tiene dos valores posibles: verdadero o falso. Y solo puede contener uno de esos valores.

Para practicar con este tipo, necesitamos introducir una sentencia de control, que veremos en más detalle en cuadernos posteriores. Esta es la sentencia “if”.

Ejercicio 6: Practicando con el tipo boolean

  1. Abre el compilador online:
  2. Introduce el siguiente código:
public class HelloWorld{

     public static void main(String []args){

        boolean paid;

        paid = false;

        System.out.println(paid);

     }

}

En la línea 3: Declaramos la variable booleana.

En la línea 4: Inicializamos la variable booleana.

Hasta aquí nada nuevo, pero pasemos a emplear el comando if para mostrar el uso de este tipo de variables.

  1. Teclea el siguiente código:
public class HelloWorld{

     public static void main(String []args){

        boolean pagado;

        pagado = false;

        if (pagado){

            System.out.println("Tu producto está en camino");

        }else{

            System.out.println("Tienes que pagar la factura para recibir el producto");

        }

     }

}
  1. Ejecuta el Código y observa el texto que se dibuja en la pantalla.
  2. Ahora, cambia el valor de pagado en la línea 4. Escribe:

pagado =true;

  1. Ejecuta el Código y observa el texto que se dibuja en pantalla.

¿Puedes explicar cómo trabaja el comando “if” basándote en los resultados que hemos obtenido? Si no entiendes como funciona, no te preocupes, lo estudiaremos en post posteriores.

Constantes

En ocasiones, utilizamos variables en las que almacenamos un valor que no queremos que cambie durante la ejecución del programa. Se trata de una constante.

Para indicar que una variable es una constante, en su declaración, tenemos que anteponer la palabra clave final a la palabra clave que indica el tipo. Por ejemplo:

final int year;

Una vez la constante ha sido inicializada, no podemos cambiar su valor.

Ejercicio 7:  Usando constantes

  1. Abre el compilador online:
  2. Introduce el siguiente código:
public class HelloWorld{

     public static void main(String []args){

         final int thisYear;

         thisYear = 2020;

        System.out.println("Hola mundo en el año "+ thisYear);

     }

}

En la línea 3: Declaramos la variable entera thisYear como una constante, añadiendo la palabra clave final.

En la línea 4: La constante thisYear es inicializada.

  1. Intentemos cambiar el valor guardado en la constante this year. Para ello simplemente tecleamos otra línea en la que intentamos dar otro valor a la constante, usando una operación de asignación.
public class HelloWorld{

     public static void main(String []args){

         final int thisYear;

         thisYear = 2020;

         thisYear = 2021;

        System.out.println("Hola mundo en el año "+ thisYear);

     }

}
  1. Ejecutamos el programa y obtenemos el siguiente error:

/HelloWorld.java:9: error: variable thisYear might already have been assigned
thisYear = 2021;
^
1 error

Casting de variables

Es muy común que necesitemos convertir el tipo de una variable a otro diferente. Esta operación es conocida como Casting.

Cuando realicemos operaciones con valores numéricos de distintos tipos, java realizará de manera automática alguna de estas conversiones, siguiendo las reglas:

  • Si uno de los valores es del tipo double, entonces el otro valor es automáticamente convertido a double.
  • Si ninguno es del tipo double pero uno es del tipo float, entonces el otro valor es convertido al tipo float.
  • Si ninguno es doble ni float pero uno es tipo long, entonces el otro valor es convertido al tipo long.
  • Si todo lo anterior falla, ambos valores son convertidos a int.

La figura de abajo muestra estas conversiones automáticas. La línea de puntos indica que podemos perder precisión cuando hacemos la conversión que indica.

Conversion de tipos java
Conversión de tipos Java

Pero hay algunas conversiones de tipo que java no hace automáticamente y tienen que ser forzadas por el programador, usando el casting.

Para castear una variable de un tipo primitivo a otro, tenemos que escribir el tipo final entre paréntesis justo delante del nombre de la variable cuyo tipo queremos cambiar. La sintaxis sería:

<variable1> = (tipo) <variable2>

El tipo de dato guardado en variable2 es casteado al tipo entre paréntesis, y ese dato con el nuevo tipo es guardado en variable1.

Veámoslo en un ejemplo.

Ejercicio 8: Casting de variables

  1. Abre el compilador online:
  2. Introduce el siguiente código:
public class HelloWorld{

     public static void main(String []args){

        double pi = 3.141592;

        System.out.println(pi);

        int piEntero = (int) pi;

        System.out.println(piEntero);

     }

}

Línea 3: Declaramos e inicializamos la variable pi como tipo double. Luego vamos a poder almacenar en ella valores decimales.

Línea 4: El valor de pi es dibujado en la pantalla.

Línea 5: Convertimos el dato en la variable pi, que es de tipo double, a tipo int. Y salvamos el dato en la variable piEntero que es del tipo int.

Línea 6: El valor de piEntero es dibujado en la pantalla.

  1. Ejecutamos el programa y obtenemos el siguiente resultado:
3.141592

3

Alcance de una variable

El alcance de una variable es la parte del programa desde donde la variable es accesible y podemos por tanto usarla. Como regla general el alcance de una variable se limita al bloque en el que ha sido declarada. Recordemos que el bloque estará marcado por una llave de inicio y otra de cierre.

Java dispone de algunas palabras clave que nos permiten modificar el alcance de una variable, yendo más allá de los límites del bloque en el que está declarada.

Realicemos una actividad para probar como funciona el alcance de las variables

Ejercicio 9: Entendiendo el alcance de una variable

  1. Abre el compilador online:
  2. Introduce el siguiente código:
public class HelloWorld{

     public static void main(String []args){

        double pi;

        pi= 3.141592;

        otherMethod();

     }

     public static void otherMethod(){

         System.out.println(pi);

     }

}

Línea 3: La variable pi es declarada dentro del método main, luego su alcance va desde la línea 2 a la línea 6.

Línea 5: Llamamos al método otherMethod

Línea 8: Intentamos usar la variable pi dentro del método otherMethod, es decir fuera de su alcance. Obviamente la variable no está disponible aquí, por lo que, si ejecutamos el programa, obtendremos el consiguiente error.

/HelloWorld.java:8: error: cannot find symbol

         System.out.println(pi);

                            ^

  symbol:   variable pi

  location: class HelloWorld

1 error
  1. Para solucionar este tema, vamos a cambiar el alcance de la variable pi. Ahora declaramos la variable pi en el cuerpo de la clase, que va desde la línea 1, al corchete de cierre en la línea 10. Y este será el alcance de la variable:
public class HelloWorld{

static double pi;   

     public static void main(String []args){

        pi= 3.141592;

        otherMethod();

     }

     public static void otherMethod(){

         System.out.println(pi);

     }

}

Línea 2: Declaramos la variable pi. Al estar dicha declaración dentro del bloque de la Clase, el alcance de esta variable va desde la línea 2 a la línea 10.

Línea 8: la variable pi es usada por la función println para dibujar su valor en pantalla. Y funciona, ya que está línea forma parte del alcance de la variable pi.

Línea 2: En la declaración de la variable, he añadido la palabra clave static antes de indicar el tipo de la variable. Esto es necesario para poder referirnos a la variable por su nombre, sin tener que usar un objeto (una instancia de la clase) para acceder a ella. En cualquier caso, no te preocupes ahora por esto, cuando veamos el cuaderno de Clases, explicare este tema en detalle.

  1. Hagamos una última prueba con una variable declarada dentro de un bloque if.

Escribimos el siguiente Código:

public class HelloWorld{

static double pi;   

     public static void main(String []args){

        pi= 3.141592;

        otherMethod();

     }

     public static void otherMethod(){

         System.out.println(pi);

         if (pi>2){

             int x = 5;

             System.out.println("x es igual a "+x);

         }

     }

}

En realidad, solo hemos añadido 4 líneas al Código anterior. Desde la línea 9 a la 12.

Línea 10: Declaro la variable x como de tipo int y la inicializo al valor 5. Así que su alcance está limitado al bloque “if”, desde la línea 9 a la 12.

Línea 11: Usamos la variable x y todo va bien, ya que estamos dentro del alcance de la variable.

Sin embargo, si moviéramos la línea 11 fuera del bloque “if”, estaríamos intentando usar la variable x fuera de su alcance, y obtendríamos el error:

/HelloWorld.java:13: error: cannot find symbol

                      System.out.println("x es igual a "+x);

                                                         ^

  symbol:   variable x

  location: class HelloWorld

1 error

Strings

Un tipo String es una secuencia de caracteres, así que puede ser visto como un texto.

No se trata de un tipo primitivo de java, sino de un tipo referenciado, definido en la clase String. Sin embargo, su uso es tan común, que en ocasiones puede parecer un tipo primitivo.

Ejercicio 10: Los Strings

  1. Abre el compilador online:
  2. Introduce el siguiente código:
public class HelloWorld{

     public static void main(String []args){

        String texto = "Hello world";

        System.out.println(texto);

     }

}

Línea 3: Declaramos e inicializamos la variable texto, de tipo String. Observa que, para la inicialización, es decir, para guardar un valor en la variable, utilizamos las dobles comillas.

Línea 4: Dibujamos por pantalla el valor de la variable texto.

  1. Combinando Strings

Teclea el siguiente código:

public class HelloWorld{

     public static void main(String []args){

        String texto1 = "Hola, ";

        String texto2 = "mi nombre es Juan";

        String textoFinal;

        textoFinal= texto1+texto2;

        System.out.println(textoFinal);

     }

}

Línea 6: Combinamos los Strings texto1 y texto2, guardando el resultado en la variable textoFinal

  1. Si ejecutamos el programa, obtendremos el resultado:

Hola, mi nombre es Juan

  1. Combinando con textos literales:

Tecleamos el código:

public class HelloWorld{

     public static void main(String []args){

        String texto1 = "Hola";

        String texto2 = "Juan";

        String textoFinal;

        textoFinal= texto1+", mi nombre es "+texto2;

        System.out.println(textoFinal);

     }

}

Línea 6: Combinamos variables tipo String con textos literales.

Si ejecutamos el programa, obtendremos el mismo resultado que antes:

Hola, mi nombre es Juan

  1. Combinando con números enteros

Tecleamos el código:

public class HelloWorld{

     public static void main(String []args){

        String texto1 = "Hola";

        String texto2 = "Juan";

        String textoFinal;

        textoFinal= texto1+", mi nombre es "+texto2;

        System.out.println(textoFinal);

        int edad = 23;

        textoFinal = texto1+", Soy "+texto2+". Tengo "+edad+" años";

        System.out.println(textoFinal);

     }

}

En realidad, hemos añadido 3 líneas a nuestro anterior Código: Desde la línea 8 a la 10.

Línea 9: Guardamos en textoFinal la combinación de variables String, textos literales y un valor numérico de una variable int. El valor entero es convertido a String para poder ser combinado con los otros, y el resultado es almacenado en la variable textoFinal, qué lógicamente es también de tipo String.

Si ejecutamos el programa, obtendremos el resultado:

Hola, mi nombre es Juan

Hola, Soy Juan. Tengo 23 años
  1. Usando un método de la clase String

He mencionado anteriormente, que String es un tipo referenciado definido en una Clase, qué nos proporciona distintos métodos para facilitarnos el trabajo con los String. Aunque no hemos hablado de las clases antes, en esta práctica, veremos cómo usar un método de la Clase String. No te preocupes si en este momento te suena extraño, estudiaremos los métodos en otro cuaderno y todo esto te quedara claro.

Teclea el siguiente Código:

public class HelloWorld{

     public static void main(String []args){

        String texto1 = "Hola";

        String texto2 = "Juan";

        String textoFinal;

        textoFinal= texto1+", mi nombre es "+texto2;

        System.out.println(textoFinal);

        int longitudTexto;

        longitudTexto = textoFinal.length();

        System.out.println("La longitud del texto de arriba es: "+longitudTexto);

     }

}

Línea 8: Declaro la variable longitudTexto de tipo int, donde voy a almacenar la longitud del texto guardado en la variable textoFinal, que es de tipo String.

Línea 9: longitudTexto es inicializada con un valor entregado por el método length de la clase String. Este método lo que hace es contar el número de caracteres.

Sin entrar en mucho detalle, vemos que cuando queremos usar un método de una clase, nos referimos a él usando una variable (un objeto), seguida de un punto y el nombre del método.

  1. Ejecuta el programa y obtendrás el resultado:
Hola, mi nombre es Juan

La longitud del texto de arriba es: 23

[clear-line]

NOTA:

Este post es parte de la colección “Java” que reproduce los apuntes de la clase que imparto sobre el tema en ESIC. Puedes ver el índice de esta colección aquí.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *