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.
| 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 |
2. Los 4 pilares de la POO
Tocá un pilar para ir directo a su diapositiva.
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.
// 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;
}
} 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.
Probá los métodos públicos: el saldo solo cambia si la validación pasa.
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.
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");
}
} 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() }; Telefono → "Pantalla encendida, buscando señal"
Laptop → "Arrancando el sistema operativo"
Tablet → "Modo lectura activado"
Una sola llamada, tres respuestas distintas.
| 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().
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.
Abstracción
¿Qué modelo?
Solo los atributos y acciones que el dominio necesita.
Encapsulamiento
¿Quién puede cambiarlo?
Solo el propio objeto, validando en sus métodos públicos.
Herencia
¿Qué reutilizo?
La base común, cuando la relación “es un” es verdadera.
Polimorfismo
¿Quién responde?
El objeto concreto en memoria, elegido en ejecución.