Interfaz vs Clases Abstractas
Comparación
Hay aspectos o usos que comparten ambos elementos dentro de la O.O. como principios de abstración, modularidad y polimorfimo (lo veremos más adelante). Pero también hay notables diferencias:
Clase Abstracta | Interfaz |
---|---|
Puede tener método abstractos y no-abstractos | Sólo métodos abstractos (desde Java 8 puede tener métodos no-abstractos por defecto y estáticos) |
No soporta herencia múltiple | Soporta implementación múltiple de interfaces |
Puede tener variables final, no-final, static y no-static | Sólo variables public, final y static |
Puede tener miembros con diferentes modos de acceso | Los métodos son public (desde Java 9 puede incluir métodos private para uso interno del interface) |
Proporciona un nivel de abstracción parcial | Proporciona un nivel de abstracción total |
Optaremos por una clase abstracta si:
- Existen clases relacionadas entre sí que necesitan compartir o reutilizar parte del código.
- Existen clases relacionadas que presentan una estructura común.
Optaremos por una interfaz:
- Deseamos especificar un comportamiento (funcionalidad pura) común para clases no necesariamente relacionadas.
- Necesitamos que las clases puedan incorporar múltiples comportamientos independientes (herencia múltiple).