Diferencias con las clases abstractas
En muchos casos una interfaz es muy similar a una clase abstracta, pero tienen sus diferencias que mostramos en la siguiente tabla:
| Características | Clase abstracta | Interfaz |
|---|---|---|
| Definición | Clase que puede contener métodos abstractos y métodos concretos. | Conjunto de métodos abstractos (en Java 8+ puede tener métodos por defecto y estáticos). |
| Métodos concretos | Puede tener métodos concretos (con implementación). | Sólo métodos abstractos hasta Java 7. Desde Java 8, puede tener métodos por defecto y estáticos. |
| Atributos | Puede tener atributos con visibilidad y pueden ser variables normales. | Todos los campos son public static final (constantes). |
| Herencia múltiple | No soporta herencia múltiple. | Una clase puede implementar varias interfaces. |
| Constructor | Puede tener constructor. | No puede tener constructor. |
| Relación | Relación "es un tipo de". | Relación "puede hacer". |
| Flexibilidad | Útil para compartir código común entre clases relacionadas. | Útil para definir contratos que deben ser implementados por diferentes clases. |
¿Cuándo usar una clase abstracta?
- Se usa cuando existe una relación "es un tipo de" entre las clases. Por ejemplo,
Avecomo clase abstracta para clases comoLorooPaloma. - Quieres definir comportamiento común que será compartido entre subclases.
- Necesitas definir atributos de instancia y métodos concretos junto con métodos abstractos.
¿Cuándo usar interfaces?
- Se usa cuando existe una relación "puede hacer" o para definir un contrato común para clases no relacionadas.
- Es ideal cuando necesitas herencia múltiple, ya que una clase puede implementar varias interfaces.
- Quieres definir sólo métodos que las clases deben implementar, sin preocuparte por la implementación predeterminada (a no ser que uses métodos por defecto).