Diferencia entre Clase Abstracta e Interfaz en Java

La diferencia entre la Clase Abstracta e Interfaz es una de las preguntas de entrevista más populares. La Clase Abstracta y la Interfaz son una parte fundamental del lenguaje de programación Java. Elegir entre una interfaz o una clase abstracta es una decisión de diseño con la que se enfrenta todo arquitecto. En mis últimos artículos, he proporcionado tantos detalles como ha sido posible acerca de la interfaz java y la clase abstracta. En esta publicación, aprenderemos sobre la diferencia entre la clase abstracta e Interfaz y cuándo deberíamos usar la interfaz en lugar de la clase abstracta y viceversa.

Diferencia entre la Clase Abstracta e Interfaz

  1. La palabra clave abstract se usa para crear una clase abstracta y también puede ser usada con métodos, mientras que la palabra clave interface se usa para crear una interfaz y no puede ser usada con métodos.
  2. Las subclases usan la palabra clave extends para extender una clase abstracta y necesitan proporcionar la implementación de todos los métodos declarados en la clase abstracta a menos que la subclase también sea una clase abstracta, mientras que las subclases usan la palabra clave implements para implementar interfaces y deben proporcionar la implementación para todos los métodos declarados en la interfaz.
  3. Las clases abstractas pueden tener métodos con implementación, mientras que la interfaz proporciona una abstracción absoluta y no puede tener ninguna implementación de método. Tenga en cuenta que a partir de Java 8 en adelante, podemos crear métodos predeterminados y estáticos en la interfaz que contienen las implementaciones de método.
  4. Las clases abstractas pueden tener constructores pero las interfaces no pueden tener constructores.
  5. La clase abstracta tiene todas las características de una clase Java normal, excepto que no se puede instanciar. Podemos usar la palabra clave abstract para hacer una clase abstracta, pero las interfaces son un tipo completamente diferente y solo pueden tener constantes públicas, estáticas y finales, y declaraciones de métodos.
  6. Los métodos de las clases abstractas pueden tener modificadores de acceso como público, privado, protegido, estático, pero los métodos de la interfaz son implícitamente públicos y abstractos, no podemos usar otros modificadores de acceso con los métodos de la interfaz.
  7. A subclass can extend only one abstract class but it can implement multiple interfaces.
  8. Las clases abstractas pueden extender otras clases e implementar interfaces, pero la interfaz solo puede extender otras interfaces.
  9. Podemos ejecutar una clase abstracta si tiene un método main(), pero no podemos ejecutar una interfaz porque no pueden tener una implementación del método principal.
  10. Las interfaces se utilizan para definir el contrato para las subclases, mientras que la clase abstracta también define un contrato, pero puede proporcionar implementaciones de otros métodos para que las subclases las utilicen.

Eso es todo para la diferencia entre una interfaz y las clases abstractas, ahora podemos pasar a saber cuándo debemos usar una interfaz en lugar de una clase abstracta y viceversa.

Interfaz o Clase Abstracta

La elección entre una interfaz o una clase abstracta para proporcionar un contrato para subclases es una decisión de diseño y depende de muchos factores. Veamos cuándo las interfaces son la mejor opción y cuándo podemos usar clases abstractas.

  1. Java no admite la herencia de múltiples niveles de clase, por lo que cada clase solo puede extender una superclase. Pero una clase puede implementar múltiples interfaces. Por lo tanto, la mayoría de las veces, las interfaces son una buena opción para proporcionar la base para la jerarquía de clases y el contrato. Además, codificar en términos de interfaces es una de las mejores prácticas para codificar en Java.
  2. Si hay muchos métodos en el contrato, entonces la clase abstracta es más útil porque podemos proporcionar una implementación predeterminada para algunos de los métodos que son comunes para todas las subclases. Además, si las subclases no necesitan implementar un método particular, pueden evitar proporcionar la implementación, pero en el caso de la interfaz, la subclase tendrá que proporcionar la implementación para todos los métodos aunque no se use y la implementación sea solo un bloque vacío.
  3. Si nuestro contrato base sigue cambiando, entonces las interfaces pueden causar problemas porque no podemos declarar métodos adicionales en la interfaz sin cambiar todas las clases de implementación. Con la clase abstracta, podemos proporcionar la implementación predeterminada y solo cambiar las clases de implementación que realmente van a utilizar los nuevos métodos.

Usar clases abstractas e interfaces

Usar interfaces y clases abstractas juntas es el mejor enfoque para diseñar un sistema. Por ejemplo, en JDK, java.util.List es una interfaz que contiene muchos métodos. Por lo tanto, existe una clase abstracta, java.util.AbstractList, que proporciona una implementación esquelética para todos los métodos de la interfaz List. De esta manera, cualquier subclase puede extender esta clase e implementar solo los métodos necesarios. Siempre debemos comenzar con una interfaz como base y definir los métodos que cada subclase debe implementar. Luego, si hay algunos métodos que solo ciertas subclases deben implementar, podemos extender la interfaz base y crear una nueva interfaz con esos métodos. Las subclases tendrán la opción de elegir entre la interfaz base o la interfaz hija para implementar según sus requisitos. Si el número de métodos crece mucho, no es mala idea proporcionar una clase abstracta esquelética que implemente la interfaz hija y brinde flexibilidad a las subclases para elegir entre la interfaz y una clase abstracta.

Cambios en la interfaz de Java 8

Desde Java 8 en adelante, podemos tener implementaciones de métodos en las interfaces. Podemos crear métodos predeterminados así como métodos estáticos en las interfaces y proporcionar una implementación para ellos. Esto ha cerrado la brecha entre las clases abstractas e interfaces y ahora las interfaces son la opción preferida porque podemos extenderlas aún más al proporcionar implementaciones predeterminadas para nuevos métodos. Para obtener más detalles, consulta Métodos predeterminados y estáticos en interfaces de Java 8.

Source:
https://www.digitalocean.com/community/tutorials/difference-between-abstract-class-and-interface-in-java