SLIDE 1 / 8

1. Del procedimiento al objeto

En la programación estructurada los datos y las funciones viven separados: cualquier función toca cualquier dato. En POO el programa es una red de objetos que protegen su propio estado y se comunican enviándose mensajes.

ESTRUCTURADA calcular() imprimir() guardar() saldo nombre edad datos globales · alto acoplamiento ORIENTADA A OBJETOS Cuenta - saldo + depositar() Cliente - nombre + getNombre() Banco - cuentas + transferir() estado encapsulado · bajo acoplamiento
DIFERENCIAS CLAVE
Criterio Estructurada POO / OOP
Enfoque Funciones secuenciales Objetos con responsabilidades
Datos Compartidos globalmente Encapsulados en el objeto
Acoplamiento Alto, con efectos colaterales Bajo, con alta cohesión
Mantenibilidad Compleja al crecer Escalable y reusable
Objeto = estado (atributos) + comportamiento (métodos), en una sola unidad responsable de sí misma.

2. Los 4 pilares de la POO

Tocá un pilar para ir directo a su diapositiva.

Cómo encajan: la abstracción decide qué modelar, el encapsulamiento protege ese modelo, la herencia lo extiende y el polimorfismo lo hace intercambiable.

3. Abstracción

Un auto real tiene miles de detalles. Para una gestión de flota solo importan unos pocos: la abstracción elige qué atributos y acciones entran en la clase y descarta el resto.

AUTO REAL color tapizado patente n.º tornillos marca olor abstraer Vehiculo - patente : String - marca : String - velocidadActual : double + acelerar(double) : void + getVelocidad() : double
Vehiculo.java
// Only the fields fleet management needs
public class Vehiculo {
    private String patente;
    private String marca;
    private double velocidadActual;

    public void acelerar(double incremento) {
        this.velocidadActual += incremento;
    }
}
Regla práctica: si un dato no se usa en ninguna decisión del sistema, no pertenece a la clase.

4. Encapsulamiento

El estado vive dentro de la cápsula y es privado. Las únicas puertas son los métodos públicos, que validan cada cambio antes de aplicarlo.

private double saldo nadie lo toca desde afuera depositar() retirar() getSaldo()
CuentaBancaria — DEMO INTERACTIVA
getSaldo() 300

Probá los métodos públicos: el saldo solo cambia si la validación pasa.

CuentaBancaria.java
private double saldo;

public void retirar(double monto) {
    if (monto > 0 && monto <= this.saldo) {
        this.saldo -= monto;
    } else {
        // invalid request: state stays untouched
    }
}

5. Herencia

Una subclase obtiene con extends el estado y el comportamiento de su superclase, y llama a super(...) para inicializar la parte heredada. Avanzá paso a paso para ver qué recibe cada hija.

Paso 0 / 3 — solo miembros propios
Dispositivo - marca : String | - encendido : boolean + encender() : void | + apagar() : void extends extends Telefono - numero : String + marca, encendido (heredados) + encender(), apagar() super(marca); Laptop - pulgadas : int + marca, encendido (heredados) + encender(), apagar() super(marca);
Telefono.java
public class Telefono extends Dispositivo {
    private String numero;

    public Telefono(String marca, String numero) {
        super(marca); // inherited part first
        this.numero = numero;
    }

    @Override
    public void encender() {
        System.out.println("Telefono listo");
    }
}
Cuidado: heredá solo cuando la relación “es un” sea verdadera. Si es “tiene un”, usá composición.

6. Polimorfismo

El arreglo declara Dispositivo, pero en memoria cada posición guarda un objeto concreto. La JVM decide en tiempo de ejecución qué implementación de encender() ejecutar: despacho dinámico.

Dispositivo[] flota = { new Telefono(), new Laptop(), new Tablet() };
flota[0] Telefono
flota[1] Laptop
flota[2] Tablet

Telefono → "Pantalla encendida, buscando señal"

Laptop → "Arrancando el sistema operativo"

Tablet → "Modo lectura activado"

Una sola llamada, tres respuestas distintas.

SOBRESCRITURA VS SOBRECARGA
Sobrescritura Sobrecarga
Dónde Entre superclase y subclase Dentro de la misma clase
Firma Idéntica Distintos parámetros
Se resuelve En ejecución (dinámico) En compilación (estático)
Marca @Override —

7. Ejercicio guiado: dispositivos electrónicos

  • Atributos privados: marca, modelo y porcentajeBateria (0 a 100).
  • usarApp(int minutos) consume 1 % de batería cada 5 minutos.
  • cargarBateria(int cantidad) sube el porcentaje sin pasar de 100.
  • Extra: subí los miembros comunes a Dispositivo y sobrescribí encender().
Dispositivo - marca, modelo : String + encender() : void Celular - porcentajeBateria : int + usarApp(int) : void Laptop - pulgadas Tablet - lapizIncluido : boolean + encender() : void
Dispositivos.java
public class Celular extends Dispositivo {
    private int porcentajeBateria;

    public Celular(String marca, int bateria) {
        super(marca);
        this.porcentajeBateria =
            Math.min(100, Math.max(0, bateria));
    }

    public void usarApp(int minutos) {
        int consumo = minutos / 5;
        this.porcentajeBateria =
            Math.max(0, porcentajeBateria - consumo);
    }

    @Override
    public void encender() {
        System.out.println("Celular encendido");
    }
}

8. Para llevarte

Cada pilar responde una pregunta distinta del diseño.

01

Abstracción

¿Qué modelo?

Solo los atributos y acciones que el dominio necesita.

02

Encapsulamiento

¿Quién puede cambiarlo?

Solo el propio objeto, validando en sus métodos públicos.

03

Herencia

¿Qué reutilizo?

La base común, cuando la relación “es un” es verdadera.

04

Polimorfismo

¿Quién responde?

El objeto concreto en memoria, elegido en ejecución.

Error 1 Declarar todo public: sin estado privado no hay encapsulamiento, solo una struct con métodos.
Error 2 Heredar para reutilizar código cuando la relación real es “tiene un”: eso pide composición.
Error 3 Cambiar la firma al “sobrescribir”: sin @Override la JVM la trata como un método nuevo.