2. Tipos de Datos y Variables
Tipos de Datos y Variables
Section titled “Tipos de Datos y Variables”En Java, los tipos de datos y las variables son conceptos fundamentales que definen cómo se almacena y manipula la información en un programa. Java es un lenguaje fuertemente tipado, lo que significa que todas las variables deben declararse con un tipo de dato específico antes de ser utilizadas.
2.1 Tipos de datos en Java
Section titled “2.1 Tipos de datos en Java”Java clasifica los tipos de datos en dos categorías principales:
- Tipos primitivos: Almacenan valores simples y están predefinidos en el lenguaje.
- Tipos de referencia: Almacenan referencias a objetos y pueden ser clases, interfaces o arrays.
2.1.1 Tipos de datos primitivos
Section titled “2.1.1 Tipos de datos primitivos”Java proporciona ocho tipos de datos primitivos, que se dividen en cuatro grupos:
Tipos enteros
Section titled “Tipos enteros”Los tipos enteros almacenan números enteros (sin parte decimal) de diferentes tamaños:
- Tamaño: 8 bits (1 byte)
- Rango: -128 a 127
- Valor por defecto: 0
- Uso: Ahorro de memoria en arrays grandes o cuando se sabe que el valor estará dentro de su rango.
- Ejemplo: byte edad = 25;
- Tamaño: 16 bits (2 bytes)
- Rango: -32,768 a 32,767
- Valor por defecto: 0
- Uso: Cuando el rango de byte es insuficiente pero se quiere ahorrar memoria.
- Ejemplo: short temperatura = -200;
- Tamaño: 32 bits (4 bytes)
- Rango: -2,147,483,648 a 2,147,483,647
- Valor por defecto: 0
- Uso: Es el tipo más común para valores enteros. Java utiliza int como tipo predeterminado para literales enteros.
- Ejemplo: int poblacion = 1000000;
- Tamaño: 64 bits (8 bytes)
- Rango: -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807
- Valor por defecto: 0L
- Uso: Para valores enteros muy grandes, como identificadores únicos o timestamps.
- Ejemplo: long poblacionMundial = 7800000000L;
- Nota: El sufijo ‘L’ indica que es un literal de tipo long.
Tipos de punto flotante
Section titled “Tipos de punto flotante”Los tipos de punto flotante almacenan números con parte decimal:
- Tamaño: 32 bits (4 bytes)
- Rango: Aproximadamente ±3.40282347E+38F (6-7 dígitos significativos)
- Valor por defecto: 0.0f
- Uso: Cuando se necesita precisión decimal con menor uso de memoria.
- Ejemplo: float precio = 19.99f;
- Nota: El sufijo ‘f’ indica que es un literal de tipo float.
- Tamaño: 64 bits (8 bytes)
- Rango: Aproximadamente ±1.79769313486231570E+308 (15 dígitos significativos)
- Valor por defecto: 0.0d
- Uso: Es el tipo predeterminado para valores decimales en Java. Ofrece mayor precisión que float.
- Ejemplo: double pi = 3.14159265359;
Tipo caracter
Section titled “Tipo caracter”- Tamaño: 16 bits (2 bytes)
- Rango: 0 a 65,535 (representa caracteres Unicode)
- Valor por defecto: ‘\u0000’ (carácter nulo)
- Uso: Almacena un único carácter Unicode.
- Ejemplo: char letra = 'A';
// Ejemplos de caracteres especiales y Unicodechar nuevaLinea = '';char tabulacion = ' ';char comillaSimple = ''';char comillaDoble = '"';char caracterUnicode = 'Ñ'; // Representa la letra Ñ (Ñ)Tipo booleano
Section titled “Tipo booleano”- Tamaño: 1 bit (aunque la implementación JVM puede variar)
- Valores posibles: true o false
- Valor por defecto: false
- Uso: Representa valores de verdad, utilizado en expresiones condicionales.
- Ejemplo: boolean esActivo = true;
Tabla comparativa de tipos primitivos
Section titled “Tabla comparativa de tipos primitivos”| Tipo | Tamaño | Rango | Valor por defecto |
|---|---|---|---|
| byte | 8 bits | -128 a 127 | 0 |
| short | 16 bits | -32,768 a 32,767 | 0 |
| int | 32 bits | -2,147,483,648 a 2,147,483,647 | 0 |
| long | 64 bits | -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807 | 0L |
| float | 32 bits | ±3.40282347E+38F (6-7 dígitos) | 0.0f |
| double | 64 bits | ±1.79769313486231570E+308 (15 dígitos) | 0.0d |
| char | 16 bits | 0 a 65,535 (Unicode) | ‘\u0000’ |
| boolean | 1 bit* | true o false | false |
2.1.2 Tipos de datos de referencia
Section titled “2.1.2 Tipos de datos de referencia”Los tipos de datos de referencia son aquellos que almacenan referencias (direcciones de memoria) a objetos en lugar de almacenar los valores directamente. A diferencia de los tipos primitivos, los tipos de referencia se crean utilizando la palabra clave new (con algunas excepciones como String).
String
Section titled “String”El tipo String es uno de los tipos de referencia más utilizados en Java. Representa una secuencia de caracteres y, aunque es técnicamente una clase, Java proporciona soporte especial para su uso:
- Inmutabilidad: Los objetos String son inmutables, lo que significa que su contenido no puede cambiar después de ser creados.
- Pool de Strings: Java mantiene un pool de strings para optimizar el uso de memoria.
- Valor por defecto: null (como todos los tipos de referencia)
- Ejemplo: String nombre = "María";
Hay dos formas principales de crear un String:
// Usando literal de string (recomendado)String nombre = "Juan";
// Usando el constructor (crea un nuevo objeto en el heap)String apellido = new String("Pérez");- - Devuelve la longitud del stringlength()
- - Devuelve el carácter en la posición especificadacharAt(int index)
- - Extrae una subcadenasubstring(int beginIndex, int endIndex)
- - Compara el contenido con otro stringequals(Object obj)
- ytoLowerCase()- Convierte a minúsculas/mayúsculastoUpperCase()
- - Concatena stringsconcat(String str)
- - Elimina espacios en blanco al inicio y finaltrim()
Arrays
Section titled “Arrays”Los arrays son estructuras de datos que almacenan múltiples valores del mismo tipo:
- Tamaño fijo: Una vez creado, el tamaño del array no puede cambiar.
- Indexación: Los elementos se acceden mediante índices que comienzan en 0.
- Valor por defecto: null para arrays de objetos, 0 para arrays numéricos, false para arrays de boolean.
// Declaraciónint[] numeros; // Forma preferidaString nombres[]; // Forma alternativa
// Inicializaciónnumeros = new int[5]; // Array de 5 enterosnombres = new String[3]; // Array de 3 strings
// Declaración e inicialización combinadasint[] primos = {2, 3, 5, 7, 11};String[] dias = {"Lunes", "Martes", "Miércoles"};// Acceso a elementosint primerNumero = numeros[0];String segundoDia = dias[1];
// Modificación de elementosnumeros[2] = 42;dias[0] = "Monday";
// Longitud del arrayint longitud = numeros.length;Clases y objetos
Section titled “Clases y objetos”Las clases son plantillas para crear objetos, que son instancias de esas clases:
// Definición de una clasepublic class Persona { // Atributos private String nombre; private int edad;
// Constructor public Persona(String nombre, int edad) { this.nombre = nombre; this.edad = edad; }
// Métodos public String getNombre() { return nombre; }}
// Creación de objetosPersona persona1 = new Persona("Ana", 30);Persona persona2 = new Persona("Carlos", 25);Wrappers (Clases envoltorio)
Section titled “Wrappers (Clases envoltorio)”Java proporciona clases wrapper para cada tipo primitivo, permitiendo usarlos como objetos:
| Tipo primitivo | Clase wrapper |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
// Autoboxing (conversión automática de primitivo a wrapper)Integer num = 100; // Equivalente a: Integer num = Integer.valueOf(100);
// Unboxing (conversión automática de wrapper a primitivo)int valor = num; // Equivalente a: int valor = num.intValue();
// Métodos útiles de las clases wrapperString numStr = Integer.toString(42); // Convierte int a Stringint numInt = Integer.parseInt("42"); // Convierte String a intInteger max = Integer.MAX_VALUE; // Valor máximo de int2.1.3 Variables y constantes
Section titled “2.1.3 Variables y constantes”Las variables son espacios de memoria que almacenan valores que pueden cambiar durante la ejecución del programa. Las constantes, por otro lado, son valores que no pueden modificarse una vez definidos.
Declaración de variables
Section titled “Declaración de variables”En Java, las variables deben declararse antes de usarse, especificando su tipo y nombre:
// Sintaxis básicatipo nombreVariable;
// Ejemplosint edad;String nombre;double salario;Inicialización de variables
Section titled “Inicialización de variables”Las variables pueden inicializarse en el momento de la declaración o posteriormente:
// Inicialización en la declaraciónint edad = 25;String nombre = "Juan";
// Inicialización posteriordouble salario;salario = 2500.50;Convenciones de nomenclatura
Section titled “Convenciones de nomenclatura”Java sigue ciertas convenciones para nombrar variables:
- Los nombres deben comenzar con una letra, un signo de dólar ($) o un guión bajo (_).
- Después del primer carácter, pueden contener letras, dígitos, signos de dólar y guiones bajos.
- No se pueden usar palabras reservadas de Java como nombres de variables.
- Java distingue entre mayúsculas y minúsculas (case-sensitive).
- Usar camelCase para nombres de variables (primera letra en minúscula, primera letra de cada palabra subsiguiente en mayúscula).
- Los nombres deben ser descriptivos y reflejar el propósito de la variable.
- Evitar nombres de una sola letra, excepto para variables temporales como índices de bucles.
// Ejemplos de nombres siguiendo convencionesint edadUsuario;String nombreCompleto;double tasaDeInteres;boolean esActivo;Declaración de constantes
Section titled “Declaración de constantes”En Java, las constantes se declaran usando las palabras clave final y generalmente static (para constantes de clase):
// Constante localfinal double PI = 3.14159;
// Constante de clase (estática)public static final int DIAS_SEMANA = 7;
// Constantes en una interfaz (implícitamente public, static y final)interface Constantes { double GRAVEDAD = 9.8; String EMPRESA = "Mi Empresa S.A.";}Variables de instancia vs. variables de clase
Section titled “Variables de instancia vs. variables de clase”Pertenecen a un objeto específico (instancia de una clase).
public class Persona { // Variables de instancia private String nombre; private int edad;
// Constructor public Persona(String nombre, int edad) { this.nombre = nombre; this.edad = edad; }}Pertenecen a la clase en sí, no a instancias específicas. Se comparten entre todas las instancias.
public class Contador { // Variable de clase (estática) private static int contadorGlobal = 0;
// Variable de instancia private int contadorLocal;
public Contador() { contadorGlobal++; contadorLocal = contadorGlobal; }
public static int getContadorGlobal() { return contadorGlobal; }
public int getContadorLocal() { return contadorLocal; }}2.1.3 Conversión de tipos (casting)
Section titled “2.1.3 Conversión de tipos (casting)”La conversión de tipos en Java permite cambiar un valor de un tipo de dato a otro. Hay dos tipos principales de conversiones:
Conversión implícita (widening)
Section titled “Conversión implícita (widening)”Ocurre automáticamente cuando se asigna un valor de un tipo de menor tamaño a uno de mayor tamaño, sin pérdida de información:
byte valorByte = 10;short valorShort = valorByte; // Conversión implícita de byte a shortint valorInt = valorShort; // Conversión implícita de short a intlong valorLong = valorInt; // Conversión implícita de int a longfloat valorFloat = valorLong; // Conversión implícita de long a floatdouble valorDouble = valorFloat; // Conversión implícita de float a doubleConversión explícita (narrowing)
Section titled “Conversión explícita (narrowing)”Se requiere cuando se asigna un valor de un tipo de mayor tamaño a uno de menor tamaño, con posible pérdida de información. Se realiza mediante un operador de casting:
double valorDouble = 9.78;float valorFloat = (float) valorDouble; // Conversión explícita de double a floatlong valorLong = (long) valorFloat; // Conversión explícita de float a longint valorInt = (int) valorLong; // Conversión explícita de long a intshort valorShort = (short) valorInt; // Conversión explícita de int a shortbyte valorByte = (byte) valorShort; // Conversión explícita de short a byteEjemplos prácticos de casting
Section titled “Ejemplos prácticos de casting”// Truncamiento de decimalesdouble precio = 23.56;int precioRedondeado = (int) precio; // precioRedondeado = 23
// Posible pérdida de informaciónint numeroGrande = 130;byte numeroPequeno = (byte) numeroGrande; // numeroPequeno = -126 (desbordamiento)// Char a int (obtiene el valor Unicode)char letra = 'A';int valorUnicode = letra; // valorUnicode = 65
// Int a char (convierte el valor numérico a su carácter Unicode)int codigo = 66;char caracter = (char) codigo; // caracter = 'B'// Conversión de String a tipos primitivosString edadTexto = "25";int edad = Integer.parseInt(edadTexto); // edad = 25
double salario = Double.parseDouble("2500.50"); // salario = 2500.50boolean activo = Boolean.parseBoolean("true"); // activo = true
// Conversión de tipos primitivos a StringString edadComoTexto = String.valueOf(30); // edadComoTexto = "30"String precioComoTexto = Double.toString(45.75); // precioComoTexto = "45.75"Métodos de conversión en Java
Section titled “Métodos de conversión en Java”Java proporciona varios métodos para convertir entre diferentes tipos de datos. Estos métodos son especialmente útiles cuando se trabaja con tipos de referencia y primitivos:
Convierten un String a un tipo primitivo:
| Método | Descripción | Ejemplo |
|---|---|---|
| Convierte un String a int | |
| Convierte un String a double | |
| Convierte un String a float | |
| Convierte un String a long | |
| Convierte un String a short | |
| Convierte un String a byte | |
| Convierte un String a boolean | |
Convierten un valor (primitivo o String) a su correspondiente objeto wrapper:
| Método | Descripción | Ejemplo |
|---|---|---|
| Convierte un String a objeto Integer | |
| Convierte un int a objeto Integer | |
| Convierte un String a objeto Double | |
| Convierte un String a objeto Boolean | |
| Convierte un char a objeto Character | |
Convierten valores a su representación en String:
| Método | Descripción | Ejemplo |
|---|---|---|
| Método estático que convierte cualquier tipo a String | |
| Convierte un int a String | |
| Convierte un double a String | |
| Método de instancia que devuelve una representación en String del objeto | |
Otros métodos útiles para conversiones específicas:
| Método | Descripción | Ejemplo |
|---|---|---|
| Convierte un int a su representación hexadecimal | |
| Convierte un int a su representación binaria | |
| Convierte un int a su representación octal | |
| Obtiene el valor numérico de un carácter | |
| Formatea valores en un String | |
2.1.4 Ámbito de variables
Section titled “2.1.4 Ámbito de variables”El ámbito (scope) de una variable define dónde es accesible dentro del código. Java tiene varios niveles de ámbito:
Ámbito de bloque
Section titled “Ámbito de bloque”Las variables declaradas dentro de un bloque de código (entre llaves {}) solo son accesibles dentro de ese bloque:
public void ejemploAmbitoBloque() { // Inicio del bloque externo int x = 10;
if (x > 5) { // Inicio del bloque interno int y = 20; // Variable de ámbito de bloque System.out.println(x); // Accesible (x está en un bloque externo) System.out.println(y); // Accesible } // Fin del bloque interno
System.out.println(x); // Accesible // System.out.println(y); // Error: y no es accesible aquí} // Fin del bloque externoÁmbito de método
Section titled “Ámbito de método”Las variables declaradas dentro de un método (variables locales) solo son accesibles dentro de ese método:
public class EjemploAmbito { public void metodo1() { int a = 10; // Variable local al método1 System.out.println(a); // Accesible }
public void metodo2() { // System.out.println(a); // Error: a no es accesible aquí int b = 20; // Variable local al método2 }}Ámbito de clase
Section titled “Ámbito de clase”Las variables declaradas a nivel de clase (campos o atributos) son accesibles desde cualquier método dentro de la clase, dependiendo de su modificador de acceso:
public class Estudiante { // Variables de instancia (nivel de clase) private String nombre; // Accesible solo dentro de esta clase protected int edad; // Accesible en esta clase y sus subclases public String curso; // Accesible desde cualquier parte
public void establecerDatos(String nuevoNombre, int nuevaEdad) { nombre = nuevoNombre; // Accesible edad = nuevaEdad; // Accesible System.out.println(curso); // Accesible }
public void mostrarDatos() { System.out.println(nombre); // Accesible System.out.println(edad); // Accesible }}Variables estáticas vs. variables de instancia
Section titled “Variables estáticas vs. variables de instancia”Pertenecen a la clase, no a instancias específicas. Son compartidas por todas las instancias de la clase.
public class Contador { // Variable estática (compartida por todas las instancias) private static int contador = 0;
public Contador() { contador++; }
public static int getContador() { return contador; }}Uso:
Contador c1 = new Contador(); // contador = 1Contador c2 = new Contador(); // contador = 2System.out.println(Contador.getContador()); // Imprime 2Cada instancia de la clase tiene su propia copia de estas variables.
public class Persona { // Variables de instancia (cada objeto tiene su propia copia) private String nombre; private int edad;
public Persona(String nombre, int edad) { this.nombre = nombre; this.edad = edad; }}Uso:
Persona p1 = new Persona("Ana", 25);Persona p2 = new Persona("Carlos", 30);// p1 y p2 tienen diferentes valores para nombre y edadSombreado de variables (Variable Shadowing)
Section titled “Sombreado de variables (Variable Shadowing)”Ocurre cuando una variable declarada en un ámbito interno tiene el mismo nombre que una variable en un ámbito externo:
public class EjemploSombreado { private int x = 10; // Variable de instancia
public void metodo() { int x = 20; // Variable local que sombrea la variable de instancia System.out.println(x); // Imprime 20 (variable local) System.out.println(this.x); // Imprime 10 (variable de instancia) }
public void otroMetodo(int x) { // Parámetro que sombrea la variable de instancia System.out.println(x); // Imprime el valor del parámetro System.out.println(this.x); // Imprime 10 (variable de instancia) }}Resumen
Section titled “Resumen”- Java es un lenguaje fuertemente tipado con ocho tipos de datos primitivos: byte, short, int, long, float, double, char y boolean.
- Las variables deben declararse con un tipo específico antes de usarse y pueden ser locales, de instancia o estáticas.
- Las constantes se declaran con la palabra clave
finaly por convención se nombran en mayúsculas. - La conversión de tipos puede ser implícita (automática) cuando se convierte de un tipo menor a uno mayor, o explícita (mediante casting) cuando se convierte de un tipo mayor a uno menor.
- El ámbito de una variable determina dónde es accesible en el código, y puede ser de bloque, de método o de clase.