diferencia entre interfaz y clase abstracta en Java

ImageImage
Erick_Romero.jpeg
autorIngeniero de Software, EPAM Anywhere

Soy un desarrollador Java con 7+ años de experiencia y altas capacidades en todos los aspectos del ecosistema Java como Spring Boot y GCP y diseñando soluciones para las personas. También soy un amante del código limpio y los algoritmos.

Soy un desarrollador Java con 7+ años de experiencia y altas capacidades en todos los aspectos del ecosistema Java como Spring Boot y GCP y diseñando soluciones para las personas. También soy un amante del código limpio y los algoritmos.

En este rápido articulo para desarrolladores de Java, vamos a conocer las diferencias entre interfaz y clases abstractas en Java, sus diferencias y en qué casos de la vida real podríamos utilizaras.

Para este articulo quiero mostrarles no solo sus diferencias si no también sus aplicaciones, ya que pienso que son muy usadas ampliamente en numerosas aplicaciones, librerías y patrones de diseño y saber sus diferencias nos van a ayudar a elegir la que mas se adecua y suple las necesidades de nuestro proyecto.

Contenido:

  • ¿Qué es una clase abstracta e interfaz?
  • Diferencias entre una clase abstracta e interfaz
  • Ejemplos de como usarlos en la vida real

Hoy en día existe una amplia necesidad de crear sistemas más complejos, mantenibles, escalables y sujetos a cambios y se encuentran en todas partes y como desarrolladores debemos saber el potencial que tenemos con interfaces y clases abstractas en java y elegir entre una o quizás ambas dependiendo del requerimiento de nuestro proyecto, eso nos dotara de la suficiente conocimiento y análisis para encontrar las mejores soluciones.

encuentra tu trabajo ideal
Solo envíanos tu CV y nuestros reclutadores te contactarán con una opción a la medida
aplica ahora
icono de lupa

¿Qué es una clase abstracta en Java?

Clases abstractas en java son un tipo de clases que no tienen una definición concreta en materia de sus propiedades y métodos de un objeto real tales como un vehículo, medio de transporte, un instrumento, figura geométrica, animales, bancos entre otros y que están relacionados entre sí, quiero que pongan mucha atención al termino relacionado que acabe de utilizar y que hacer parte de lo que identifica el uso de una clase abstracta.

A mi me gusta cuando me explican con ejemplos y eso es lo que vamos a hacer ahora.

Tenemos el ejemplo de una clase abstracta llamada vehículo con los siguientes métodos.

Sabemos que todos los vehículos tienen que arrancar o parar su trayecto, pero, aunque conocemos algunos métodos que la clase Vehicle puede usar aun no contamos un objeto concreto del cual se le pueda dar una implementación completa, entonces seguimos buscando una clase que pueda representar implementar estos métodos y validar si se puede darle una implementación concreta.

Hemos encontrado la clase Car que es un medio de transporte derivado de la clase Vehicle y cuenta con sus propios métodos los cuales son y que extiende de la clase abstracta Vehicle.

Sabiendo eso nos surge una pregunta ¿todos los carros del mundo tienen conducción autónoma, 4 puertas e inclusive el tipo de combustible? Es una pregunta que nos hacer pensar que no podemos darle una implementación completa también a la clase que la Clase Car no nos daría una implementación concreta, entonces por eso decimos que Car es considerada una clase abstracta java.

Con esto debemos pensar mucho mas profundo y ver que tenemos distintos tipos de carros que existen como BMW, TOYOTA, MERCEDES y entre otros, y que sus características y comparten ciertas funcionalidades que podríamos abstraer en métodos y así crear una clase concreta que defina bien su comportamiento en la vida real.

Entonces la jerarquía de clases que se crean y se relacionan entre si serian Vehicle -> Car -> Tesla o las distintas marcas de coche y al extender hacemos uso de la herencia para heredar los métodos comunes.

Así quedarían la clase BMW y que tendría una implementación concreta.

Ya hemos aprendido acerca de las clases abstractas en java y es tiempo de ver las interfaces que son un tipo de clases que nos permiten crear abstracción en Java pero que su fin es la de relacionar clases que no están relacionada entre sí y no se conoce su implementaron, también permite la multi herencia ya que solo una clase puede extender de solo una clase padre.

En este ejemplo nos sabemos nada de la clase, como funciona, ni que métodos en común tiene, por lo cual haremos uso de una interfaz y nuestro ejemplo va a ser consumir una API la cual es externa y no la conocemos y va a hacer consumida por diferentes sistemas A Y B y que también nos dará la capacidad de ser implementada las veces que queramos por distintas clases así estas hayan extendido de otra clase.

Como no conocemos la API, podemos crear esa implementación apoyándonos de la interfaz Unknown API.

Y las clases SystemA y SystemB van a darle la correcta implementación acorde a los requerimientos de la API y a su vez estamos relacionando dos sistemas diferentes.

Y si ejecutamos el ejemplo obtenemos lo siguiente

Getting data from System A

Posting data from System B

Habiendo explicado un poco lo que es una clase abstracta en java e interfaz, vamos a conocer sus diferencias y naturalidad la cual nos van a permitir escoger la mejor para nuestros próximos proyectos.

Interfaz

Clase abstracta

1

Se usa si no se sabe nada de su implementación.

Se usa cuando se conoce parcialmente su implementación.

2

Cada método debería ser public y abstract hasta java 1.8.

Podemos tener métodos privados desde java 1.9.

Se puede tener métodos abstractos y concretos, pero al menos se debe tener un abstracto.

3

Los siguientes modificadores de acceso están restringidos, protected, final, static, syncronized, native para declarar métodos en las interfaces.

No hay restricción para los modificadores de acceso de métodos en clases abstractas.

4

Cada variable debe ser public, static y final.

Las variables pueden ser public, static y final.

5

Las variables en las interfaces no deben ser protected, transient y volatile.

No hay restricción para los modificadores de acceso de las variables en clases abstractas.

6

Se deben inicializar las variables de lo contrario habrá un error en tiempo de compilación.

No hay restricción para inicializar las variables.

7

No se pueden declarar constructores en las interfaces.

Se pueden declarar constructores en las clases abstractas.

Ya hemos visto que son las interfaces y clases abstractas en java y vimos su uso en la vida real y como tener idea de cual usar y por ultimo las reglas que rigen su uso y que debemos seguir para poder crear robustas, mantenibles y flexibles aplicaciones.

También podremos ver el uso de interfaces en arquitecturas de software como onion architecture, hexagonal architecture y patrones de diseño como Strategy, State, Adapter, Bridge entre otros.

y hablando de las clases abstractas tenemos el patrón decorador y Liskov Substitution principle from SOLID.

Espero que hayan aprendido un poco más de este tema, que es muy importante y sepan decidir qué tipo de opction pueden utilizar si clase abstracta o interfaz java.

Les comparto el link de repositorio con los ejemplos que mostré y también la fuente de donde tomé las diferencia entre interfaz y clase abstracta

Happy coding!

actualizado 24 Feb 2024
Erick_Romero.jpeg
autorIngeniero de Software, EPAM Anywhere

Soy un desarrollador Java con 7+ años de experiencia y altas capacidades en todos los aspectos del ecosistema Java como Spring Boot y GCP y diseñando soluciones para las personas. También soy un amante del código limpio y los algoritmos.

Soy un desarrollador Java con 7+ años de experiencia y altas capacidades en todos los aspectos del ecosistema Java como Spring Boot y GCP y diseñando soluciones para las personas. También soy un amante del código limpio y los algoritmos.