Esta referencia cubre los conceptos avanzados de Java centrados en la Programación Orientada a Objetos (POO). Estos temas se exploran en profundidad durante la segunda parte de la cátedra.
1. Clases y Objetos¶
A diferencia de la programación imperativa pura, en la POO el código se organiza alrededor de los objetos y sus interacciones.
Definición de una Clase¶
Una clase es la “plantilla” o plano para crear objetos.
public class CuentaBancaria {
// Atributos (Estado)
private String numero;
private double saldo;
// Constructor (Inicialización)
public CuentaBancaria(String numero, double saldoInicial) {
this.numero = numero;
this.saldo = saldoInicial;
}
// Métodos (Comportamiento)
public void depositar(double monto) {
if (monto > 0) {
this.saldo += monto;
}
}
}Para profundizar en la estructura de clases, consultá
2. Los Pilares de la POO¶
Encapsulamiento¶
Protección del estado interno mediante modificadores de acceso.
private: Solo accesible dentro de la clase.public: Accesible desde cualquier lugar.protected: Accesible por subclases y dentro del mismo paquete.
Herencia¶
Permite crear nuevas clases basadas en clases existentes. Se usa la palabra clave extends.
public class CuentaAhorro extends CuentaBancaria {
private double tasaInteres;
public CuentaAhorro(String numero, double saldo, double tasa) {
super(numero, saldo); // Llama al constructor de la superclase
this.tasaInteres = tasa;
}
}Polimorfismo¶
Capacidad de un objeto de tomar múltiples formas. Una variable de tipo superclase puede referenciar un objeto de cualquier subclase.
CuentaBancaria cuenta = new CuentaAhorro("123", 1000, 0.05);
cuenta.depositar(500); // Se ejecuta el comportamiento apropiadoConsultá
3. Interfaces y Clases Abstractas¶
Las interfaces definen contratos (qué debe hacer un objeto), mientras que las clases abstractas sirven como bases parciales que no pueden instanciarse directamente.
public interface Validador {
boolean esValido();
}
public abstract class Vehiculo {
public abstract void mover(); // Método sin implementación
}4. Genéricos y Colecciones¶
Java proporciona un potente framework para manejar conjuntos de datos de forma dinámica y segura.
El Java Collections Framework (JCF)¶
List<T>: Listas ordenadas (ej:ArrayList,LinkedList).Set<T>: Conjuntos sin duplicados (ej:HashSet,TreeSet).Map<K, V>: Diccionarios clave-valor (ej:HashMap,TreeMap).
List<String> nombres = new ArrayList<>();
nombres.add("Java");
nombres.add("POO");
for (String n : nombres) {
System.out.println(n);
}Podés encontrar la guía completa de colecciones en
5. Excepciones Avanzadas¶
El manejo de errores en Java es robusto y obliga al programador a considerar situaciones de fallo.
try (BufferedReader br = new BufferedReader(new FileReader("archivo.txt"))) {
// Código que puede fallar
} catch (FileNotFoundException e) {
System.err.println("Archivo no encontrado");
} catch (IOException e) {
System.err.println("Error de lectura");
} finally {
// Se ejecuta siempre (opcional si se usa try-with-resources)
}6. Programación Funcional y Streams (Temas Excluidos)¶
Expresiones Lambda¶
Son funciones anónimas que permiten escribir código más conciso.
Restricción: No se permiten. Consultá la
0x6000- No usar expresiones lambda ni referencias a métodos.
// PROHIBIDO en el curso
lista.forEach(n -> System.out.println(n));API de Streams¶
Permite procesamiento de datos en estilo declarativo/funcional.
Restricción: No se permite. Consultá la
0x6002- No usar métodos funcionales de colecciones ni encadenamiento.
// PROHIBIDO en el curso
int suma = numeros.stream()
.filter(n -> n > 0)
.mapToInt(Integer::intValue)
.sum();Referencias a Métodos¶
Sintaxis compacta para llamar a métodos existentes.
Restricción: No se permiten. Consultá la
0x6001- No usar la API de Streams niCollectors.
// PROHIBIDO en el curso
lista.forEach(System.out::println);7. Temas Complementarios¶
Durante el curso también exploraremos:
SOLID: Principios de diseño para código mantenible (
. . /parte _2 /09 _oop _solid). Patrones de Diseño: Soluciones probadas a problemas recurrentes (
. . /parte _2 /10 _oop _patrones). Testing de Objetos: Uso de JUnit en contextos de POO (
. . /parte _2 /11 _oop _testing).
8. Clases Internas Anónimas¶
Las clases internas anónimas permiten declarar e instanciar una clase al mismo tiempo, sin darle un nombre. Son útiles para implementaciones de un solo uso de interfaces o clases abstractas.
// Ejemplo usando un Comparador externo
Collections.sort(lista, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
});