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).