SLIDE 1 / 7

1. Clase Abstracta: El Molde Incompleto en Memoria

Una clase abstracta representa un concepto que no puede existir por sí mismo en el mundo real (ej. "Figura"). El compilador prohíbe taxativamente hacer new Figura(); solo sus subclases concretas completas pueden nacer en el Heap.

new Figura() ✕ ERROR DE COMPILACIÓN Figura is abstract; cannot be instantiated Heap: Instancias Concretas Válidas Circulo @0x91A0 radio = 5.0 | color = "Rojo" calcularArea() -> Math.PI * r * r Rectangulo @0x91B4 base = 4.0 | altura = 6.0 calcularArea() -> base * altura
Inspección de Contrato
Clase Base Abstracta: public abstract class Figura
Método Abstracto Forzado: abstract double calcularArea()
Cálculo de Área Resuelto: 78.54 u²
public abstract class Figura {
  private String color;
  public abstract double calcularArea(); // Sin cuerpo
}

2. Interfaces: El Enchufe y Contrato Universal

Una interfaz es un puerto estándar que desacopla por completo quién consume un servicio de cómo se implementa. El cliente solo habla con la interfaz Exportable sin saber si los bytes van a PDF, Excel o JSON.

Cliente ReporteServicio exportar() <<interface>> Exportable byte[] exportar(); Puerto universal USB DocumentoPDF implements Exportable ReporteExcel implements Exportable MensajeJSON implements Exportable
Conector de Formatos
Tipo de Conexión: Exportable exp = new DocumentoPDF()
Salida Generada: application/pdf (bytes[])
public void procesar(Exportable exp) {
  byte[] datos = exp.exportar(); // Desacople total
}

3. Métodos default y la Resolución del Diamante

Java 8 incorporó métodos default para evolucionar interfaces sin romper implementaciones existentes. Si una clase implementa dos interfaces que definen el mismo método default, el compilador exige resolver la colisión explícitamente.

Interfaz Base Interfaz ImpresoraA default void imprimir() Interfaz ImpresoraB default void imprimir() Clase Multifuncion ImpresoraA.super.imprimir();
Resolución de Conflicto
Colisión de Firmas: Ambas tienen default void imprimir()
Solución Java Obligatoria: ImpresoraA.super.imprimir();
@Override
public void imprimir() {
  ImpresoraA.super.imprimir(); // Desambiguación explícita
}

4. Herencia vs Implementación: is-a frente a can-do

Una clase solo puede extender una superclase ("is-a", identidad y estado compartido), pero puede implementar infinitas interfaces ("can-do", habilidades ortogonales).

abstract class Ave estado: plumaje, pico (is-a) class Pato extends Ave <<Volador>> can-do: volar() <<Nadador>> can-do: nadar()
Matriz Comparativa
Herencia Simple: extends (1 sola clase base)
Implementación Múltiple: implements (N interfaces)
Estado en Memoria: Variables de instancia solo en clases
public class Pato extends Ave 
    implements Volador, Nadador {
  // Hereda estado de Ave
  // Cumple contratos de Volador y Nadador
}

5. Namespaces y Paquetes: Evitar Colisiones

Los paquetes en Java estructuran el código y resuelven colisiones de nombres mediante el FQCN (Fully Qualified Class Name). Dos clases llamadas Item pueden coexistir si pertenecen a paquetes distintos.

package com.tienda.pedidos; class Item { ... } Artículo de catálogo pedido package com.tienda.envios; class Item { ... } Bulto físico embalado Desambiguación en Checkout.java import com.tienda.pedidos.Item; // Import simple para el más usado com.tienda.envios.Item bulto = new com.tienda.envios.Item(); // FQCN explícito
Visibilidad de Paquete
Modificador Default (sin keyword): package-private
Acceso: Visible en mismo paquete
Desde afuera del paquete: Invisible (encapsulado)
// package-private: solo visible para el paquete
class ValidadorInterno {
  void validar() { ... }
}

6. Modelado: Asociación, Agregación y Composición

No todo es herencia. El acoplamiento entre objetos se gradúa según la dependencia de su ciclo de vida en el Heap: Asociación (débil), Agregación (compartido) y Composición (fuerte, muerte en cascada).

1. Asociación (Uso mutuo) Conductor ────> Vehiculo Ciclos de vida independientes 2. Agregación (Rombo blanco ◇) Departamento ◇──── Profesor Si cierra depto, el profesor sobrevive 3. Composición (Rombo negro ◆) Factura ◆──── ItemFactura Si muere Factura, mueren sus ítems (GC)
Simulador de Ciclo de Vida
Estado Profesor (Agregación): VIVO en Heap (independiente)
Estado ItemFactura (Composición): Intacto
// Composición: la Factura crea y posee sus items
public class Factura {
  private final Item[] items;
}

7. Desafío: Simulador Polimórfico de Medios de Pago

Ejecución polimórfica en acción: una clase abstracta MedioPago define procesarPago(monto) y una interfaz Reembolsable agrega la capacidad reembolsar(). Probá cada medio y verificá cómo reacciona el sistema.

Tarjeta de Crédito (Visa/Mastercard) implements Reembolsable, Notificable Comisión: 3.5% | Proceso con pasarela bancaria Estado de la Transacción ($1,000.00) ✓ Pago APROBADO: $1,035.00 debitado instanceof Reembolsable: SÍ -> Reembolso habilitado
Pasarela de Cobro
Monto Base: $1,000.00
Comisión Calculada: +$35.00 (3.5%)
Permite Reembolso: SÍ
public void procesar(MedioPago m, double monto) {
  m.procesarPago(monto); // Abstracto
  if (m instanceof Reembolsable r) {
    r.emitirComprobante();
  }
}