Java es un lenguaje de programación orientado a objetos, utilizado ampliamente por su robustez, portabilidad y eficiencia.
Es muy empleado en aplicaciones de servidor, sistemas distribuidos y desarrollo de aplicaciones móviles.
Configuración del entorno
Instalación de JDK
Para la instalación de JDK (Java Development Kit)
Verificar la instalación de Java
Comprueba si Java está correctamente instalado.
java -version
Configurar la variable de entorno JAVA_HOME
Asegúrate de tener la variable JAVA_HOME
correctamente configurada.
export JAVA_HOME=/ruta/al/jdk
export PATH=$JAVA_HOME/bin:$PATH
Compilación y ejecución
Compilar un programa Java
El compilador de Java (Javac) convierte el código fuente .java
a bytecode .class
.
javac MiPrograma.java
Ejecutar un programa Java
Usa el comando java
para ejecutar el bytecode generado.
java MiPrograma
Compilar y ejecutar en una línea
En sistemas UNIX, puedes combinar ambos comandos en una sola línea.
javac MiPrograma.java && java MiPrograma
Sintaxis y tipos de datos
Estructura básica
Un programa en Java generalmente consta de una clase pública con un método main
.
public class MiPrograma {
public static void main(String[] args) {
System.out.println("Hola, Mundo!");
}
}
Tipos primitivos
Java soporta los siguientes tipos de datos primitivos:
Tipo | Tamaño | Valores |
---|---|---|
byte | 1 byte | -128 a 127 |
short | 2 bytes | -32,768 a 32,767 |
int | 4 bytes | -2^31 a 2^31-1 |
long | 8 bytes | -2^63 a 2^63-1 |
float | 4 bytes | Precisión simple de 32 bits |
double | 8 bytes | Precisión doble de 64 bits |
char | 2 bytes | Un carácter Unicode (16 bits) |
boolean | 1 bit | true o false |
Tipos de referencia
Incluyen cualquier objeto y se asignan a null
si no apuntan a un objeto.
Declaración de variables
Para declarar una variable en Java, se especifica el tipo seguido del nombre.
int numero = 10;
double precio = 25.5;
char letra = 'A';
boolean esVerdadero = true;
Operadores
Operadores Aritméticos
Estos son los operadores para realizar operaciones matemáticas:
Operador | Descripción | Ejemplo |
---|---|---|
+ | Suma | a + b |
- | Resta | a - b |
* | Multiplicación | a * b |
/ | División | a / b |
% | Módulo (residuo) | a % b |
Operadores relacionales
Se utilizan para comparar dos valores.
Operador | Descripción | Ejemplo |
---|---|---|
== | Igual a | a == b |
!= | No igual a | a != b |
> | Mayor que | a > b |
< | Menor que | a < b |
>= | Mayor o igual que | a >= b |
<= | Menor o igual que | a <= b |
Operadores lógicos
Permiten realizar operaciones lógicas sobre variables booleanas.
Operador | Descripción | Ejemplo |
---|---|---|
&& | Y lógico (AND) | a && b |
` | ` | |
! | Negación lógica | !a |
Control de flujo
Condicionales
If - Else
Se usa para tomar decisiones basadas en condiciones.
if (condicion) {
// Bloque si la condición es verdadera
} else {
// Bloque si la condición es falsa
}
Switch
Permite evaluar múltiples casos para una misma expresión.
int dia = 2;
switch (dia) {
case 1:
System.out.println("Lunes");
break;
case 2:
System.out.println("Martes");
break;
default:
System.out.println("Otro día");
}
Bucles
Bucle For
El bucle for
se usa cuando conoces el número de iteraciones.
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
Bucle While
Este bucle repite mientras la condición sea verdadera.
int i = 0;
while (i < 5) {
System.out.println(i);
i++;
}
Bucle Do-While
A diferencia de while
, ejecuta el bloque de código al menos una vez.
int i = 0;
do {
System.out.println(i);
i++;
} while (i < 5);
Métodos
Definición de métodos
Los métodos son bloques de código reutilizables.
public int suma(int a, int b) {
return a + b;
}
Llamada a métodos
int resultado = suma(5, 10);
System.out.println(resultado);
Expresiones Lambda
Permiten tratar el código como datos y mejorar la legibilidad.
import java.util.Arrays;
Arrays.asList(1, 2, 3).forEach(num -> System.out.println(num * 2));
Colecciones
Listas
Utiliza ArrayList
para almacenar elementos dinámicamente.
import java.util.ArrayList;
ArrayList<String> lista = new ArrayList<>();
lista.add("Elemento 1");
lista.add("Elemento 2");
Mapas
HashMap
para almacenar pares clave-valor.
import java.util.HashMap;
HashMap<String, Integer> mapa = new HashMap<>();
mapa.put("Clave1", 1);
mapa.put("Clave2", 2);
Clases y objetos
Definición de clase
Una clase es una plantilla para crear objetos.
class Persona {
String nombre;
int edad;
void saludar() {
System.out.println("Hola, mi nombre es " + nombre);
}
}
Crear un objeto
Un objeto es una instancia de una clase.
Persona persona1 = new Persona();
persona1.nombre = "Luis";
persona1.edad = 25;
persona1.saludar();
Constructores
Un constructor inicializa los objetos al ser creados.
class Persona {
String nombre;
int edad;
// Constructor
Persona(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
}
Crear un objeto con constructor
Persona persona2 = new Persona("Ana", 30);
Modificadores de acceso
Los modificadores de acceso controlan la visibilidad de los miembros de una clase.
Modificador | Acceso desde… | Ejemplo |
---|---|---|
public | Cualquier clase | public int edad; |
private | Solo dentro de la clase | private int edad; |
protected | Subclases y paquete | protected int edad; |
Programación orientada a objetos
Definición de herencia
La herencia permite que una clase derive de otra, heredando sus atributos y métodos.
class Animal {
void hacerSonido() {
System.out.println("El animal hace un sonido");
}
}
class Perro extends Animal {
void hacerSonido() {
System.out.println("El perro ladra");
}
}
Uso de herencia
Animal miAnimal = new Animal();
miAnimal.hacerSonido();
Perro miPerro = new Perro();
miPerro.hacerSonido();
Uso de super
Se utiliza para llamar al constructor de la clase padre.
public class Estudiante extends Persona {
public Estudiante(String nombre, int edad, String carrera) {
super(nombre, edad);
this.carrera = carrera;
}
}
Interfaces
Una interfaz define métodos que deben ser implementados por las clases que la heredan.
interface Volador {
void volar();
}
class Pajaro implements Volador {
public void volar() {
System.out.println("El pájaro vuela");
}
}
Polimorfismo
Una misma referencia puede apuntar a diferentes tipos de objetos.
Volador v = new Pajaro();
v.volar(); // Llamará al método de la clase Pajaro
Excepciones
Manejo de excepciones
Las excepciones permiten manejar errores de forma controlada.
try {
int resultado = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("Error: División por cero.");
} finally {
System.out.println("Bloque finally siempre se ejecuta.");
}
Lanzar excepciones
public void verificarEdad(int edad) throws Exception {
if (edad < 18) {
throw new Exception("No tiene la edad suficiente.");
}
}
Librerías estándar
Clases Comunes de java.util
Clase ArrayList
Se utiliza para almacenar listas dinámicas.
import java.util.ArrayList;
ArrayList<String> lista = new ArrayList<>();
lista.add("Elemento 1");
lista.add("Elemento 2");
System.out.println(lista.get(0)); // Acceder al primer elemento
Clase HashMap
Se usa para almacenar pares clave-valor.
import java.util.HashMap;
HashMap<String, Integer> map = new HashMap<>();
map.put("Uno", 1);
map.put("Dos", 2);
System.out.println(map.get("Uno")); // Imprime 1
Concurrencia
Threads
La clase Thread
permite la ejecución concurrente de tareas.
class MiThread extends Thread {
public void run() {
System.out.println("El hilo está corriendo");
}
}
MiThread hilo = new MiThread();
hilo.start();
Sincronización
Utiliza synchronized
para evitar condiciones de carrera.
public synchronized void metodoSincronizado() {
// código seguro
}
Entrada y salida
Leer desde consola
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
System.out.print("Introduce tu nombre: ");
String nombre = scanner.nextLine();
Leer y escribir archivos
import java.io.*;
try {
BufferedWriter writer = new BufferedWriter(new FileWriter("archivo.txt"));
writer.write("Hola, Mundo!");
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new FileReader("archivo.txt"));
String linea;
while ((linea = reader.readLine()) != null) {
System.out.println(linea);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
Streams
Los Streams
permiten procesar colecciones de datos de forma funcional.
List<String> lista = Arrays.asList("a", "b", "c");
lista.stream().filter(s -> s.startsWith("a")).forEach(System.out::println);