Lo que vas a aprender
- Qué son las clases, los objetos, los atributos y los métodos.
- Cómo se escriben los constructores.
- La encapsulación y los modificadores de acceso.
- Los miembros
static. - La herencia, la sobrescritura y
super. - Las clases abstractas, las interfaces y el polimorfismo.
Fundamentos
Clases y objetos
Una clase es un molde; un objeto es un ejemplar concreto creado connew.
this se refiere al objeto actual; distingue el atributo this.titular del parámetro titular.
Encapsulación
Los atributos se declaranprivate y se accede a ellos con métodos públicos (getters y setters). Así la clase controla su estado: nadie puede poner un saldo negativo desde fuera.
static
Un atributo o métodostatic pertenece a la clase, no a cada objeto. Se usa para contadores compartidos, constantes (static final double PI) y funciones de utilidad (Math.sqrt). Un método static no puede usar this.
Herencia
Una clase puede heredar de otra conextends: recibe sus atributos y métodos, y puede añadir o cambiar comportamiento.
Object.
Sobrescritura
Una subclase puede redefinir un método del padre con la misma firma. Se marca con@Override para que el compilador compruebe que de verdad sobrescribe algo.
Clases abstractas e interfaces
Polimorfismo
Una variable de un tipo general puede guardar objetos de cualquier subtipo, y al llamar a un método se ejecuta la versión del objeto real:Triangulo, sigue funcionando sin cambios.
equals y hashCode
== compara referencias (si son el mismo objeto). Para comparar contenido se sobrescribe equals, y siempre a la vez hashCode, para que el objeto funcione bien en un HashMap o HashSet (ver tablas hash).
Principios de diseño
- Encapsula lo que cambia y oculta los detalles.
- Prefiere la composición a la herencia: que una clase tenga otra en vez de heredar de ella, salvo que sea de verdad un “es un”.
- Programa contra interfaces: declara variables como
List<String>en lugar deArrayList<String>. - Una clase, una responsabilidad.
Ejemplos resueltos
Ejemplo 1 · Contador de objetos con static
Ejemplo 1 · Contador de objetos con static
new Alumno(); new Alumno();, Alumno.getTotal() devuelve 2, y cada alumno tiene su propio id.Ejemplo 2 · Polimorfismo con una lista
Ejemplo 2 · Polimorfismo con una lista
describir es del padre, pero llama al area() de cada hijo.Ejemplo 3 · equals mal y bien
Ejemplo 3 · equals mal y bien
Ejemplo 4 · Composición en vez de herencia
Ejemplo 4 · Composición en vez de herencia
Un
Coche no es un Motor, pero tiene uno: private Motor motor; y métodos que delegan en él (arrancar() llama a motor.encender()). Así se puede cambiar de motor sin tocar la jerarquía.Errores frecuentes
- Comparar objetos con
==, sobre todo cadenas. Usaequals. - Hacer públicos los atributos. Se pierde el control del estado del objeto.
- Sobrescribir
equalssinhashCode. - Olvidar llamar a
super(...)cuando el padre no tiene constructor sin parámetros. - Abusar de la herencia para reutilizar código cuando no hay una relación “es un”.
- Confundir sobrecarga (mismo nombre, distintos parámetros, en la misma clase) con sobrescritura (misma firma, en una subclase).
Preguntas frecuentes
¿Para qué sirve la POO si se puede programar con funciones?
¿Para qué sirve la POO si se puede programar con funciones?
Para organizar programas grandes: agrupa datos y operaciones relacionados, oculta los detalles internos y permite extender el comportamiento (con herencia e interfaces) sin modificar el código que ya funciona. En programas pequeños la diferencia es menor.
¿Qué son los patrones de diseño?
¿Qué son los patrones de diseño?
Soluciones probadas a problemas habituales de diseño orientado a objetos, recogidas en 1994 por la “banda de los cuatro”: Singleton, Factory, Observer, Strategy, Decorator… Por ejemplo, Strategy encapsula un algoritmo en una interfaz para poder cambiarlo en tiempo de ejecución.
Temas relacionados
ArrayList y lista enlazada
Las colecciones de Java por dentro.
Tablas hash
Por qué equals y hashCode van juntos.
POO en Python
Los mismos conceptos en Python.