arrow_back Volver
Inicio keyboard_arrow_right Artículos keyboard_arrow_right Artículo

Diferencia entre clases abstractas e interfaces en Java

Eduardo Ismael Garcia

Full Stack Developer at Código Facilito.

av_timer 4 Min. de lectura

remove_red_eye 202253 visitas

calendar_today 27 Enero 2020

Hace un par de días en CódigoFacilito nos llegó una pregunta muy puntual acerca de Java, una pregunta que muy probablemente en algún momento te hayas hecho ¿Cúal es la diferencia entre una clases abstracta y una interfaz? 🤔 Al ser conceptos muy parecidos de programación orientada a objetos sin duda estos temas pueden ser difíciles de comprender y puede que a más de uno le haya causado uno que otro dolor de cabeza, 😲es por ello que en esta ocasión me gustaría que explicaremos en detalle qué es una clase abstracta, qué es una interfaz, en qué caso son buenos utilizarlos y por su puesto, cual es la diferencia entre uno y otro.

Bien, una vez dicho todo esto comencemos.

Clases abstractas

Comencemos hablando de clases abstractas.

Habrá ocasiones en las cuales necesitemos crear una clase padre donde únicamente coloquemos la estructura de una abstracción, una estructura muy general, dejando que sean las clases hijas quienes definan los detalles. En estos casos haremos uso de las clases abstractas.

Una clase abstracta es practicamente identica a una clase convencional; las clases abstractas pueden poseer atributos, métodos, constructores, etc ... La principal diferencia entre una clases convencional y una clase abstracta es que la clase abstracta debe poseer por lo menos un método abstracto. Ok, pero ahora, ¿ Qué es un método abstracto? Verás, un método abstracto no es más que un método vacío, un método el cual no posee cuerpo, por ende no puede realizar ninguna acción. La utilidad de un método abstracto es definir qué se debe hacer pero no el cómo se debe hacer.

Veamos un ejemplo para que nos quede más en claro.

public class Figura {

    private int numeroLados;

    public Figura() {

        this.numeroLados = 0;
    }

    public float area() {
        return 0f;
    }
}

En este caso la clase posee una atributo, un constructor y un método, a partir de esta clase podré generar la n cantidad de figuras que necesite, ya sean cuadrados, rectangulos, triangulos, circulos etc...

Dentro de la clase encontramos el método área, método que se encuentra pensado para obtener el área de cualquier figura, sin embargo cómo sabemos todas las figuras poseen su propia fórmula matemática para calcular su área. Si yo comienzo a heredar de la clase Figura todas las clases hijas tendrían que sobre escribir el método área e implementar su propia formula para así poder calcular su área. En estos casos, en los casos la clase hija siempre deba que sobreescribir el método lo que podemos hacer es convertir al método convencional en un método abstracto, un método que defina qué hacer, pero no cómo se deba hacer. 😃

public abstract float area();

Ahora que el método área es un método abstracto la clase se convierte en una clase abstracta.

public abstract class Figura {

Es importante mencionar que las clases abstractas pueden ser heredadas por la n cantidad de clases que necesitemos, pero no pueden ser instanciadas. Para heredar de una clase abstracta basta con utilizar la palabra reservada extends.

public class Triangulo extends Figura {

Al nosotros heredar de una clase abstracta es obligatorio implementar todos sus métodos abstractos, es decir debemos definir comportamiento, definir cómo se va a realizar la tarea.

Interfaces

Ahora hablaremos de interfaces. A pesar que es un tema un poco complejo si nosotros hemos comprendido el tema de clases abstractas y el por que de ellas, el tema de interfaces será un tema muy sencillo.

Veamos. A diferencia de otros lenguajes de programación, en Java no es posible la herencia múltiple, nuestras clases únicamente podrán heredar de una y solo una clase.

Si conceptualizamos esto una representación pudiese ser la siguiente.

El nivel de jerarquía es descendente.

Esto sin duda funciona, sin embargo, si queremos representar conceptos de la vida real necesitaremos una jerarquía mucho más compleja, algo como esto.

Para que podamos diagramar nuestro proyecto de esta forma, teniendo en cuenta que únicamente es posible heredar de una clase, entonces haremos uso de interfaces.

Podemos definir a una interfaz como una colección de métodos abstractos y propiedades constantes en las que se especifica que se debe de hacer pero no como, serán las clases hijas quienes definan el comportamiento.

A diferencia de una clase abstracta, una interface no puede hacer nada por sí sola, es prácticamente un contrato, en donde las clases que la implementen deben, obligatoriamente, definir el comportamiento de todos los métodos abstractos, contestando a la pregunta ¿Cómo se debe hacer?

Veamos un ejemplo de una interfaz.

public interface Canino
{
            public abstract void aullar();
            public abstract void ladrar();
}

Cómo podemos observar en la interfaz solo encontraremos métodos abstractos, método vacíos. Para poder implementar la interfaz basta con utilizar la palabra reservada implements.

public class Perro implements Canino { 

Si bien es cierto que en versiones actuales de Java podemos encontrar los métodos default en las interfaces, métodos que nos permite definir comportamientos, en esencia las interfaces serán contratos que indicarán que es lo que se debe hacer sin proveer ninguna funcionalidad.

Otra diferencia entre una clase abstracta y una interface recae en su implementación ya que una clase hija solo podrá heredar de una clase abstracta, por otro lado podrá hacer uso de la n cantidad de interfaces que necesite.

public class Perro extends Mascota implements Canino

Conclusión

En conclusión un método abstracto no es más que un método vacío el cual resuelve la pregunta ¿Qué se debe hacer? pero no el ¿Cómo se deba hacer? ya que serán las clases hijas quienes definan el comportamiento.

Los métodos abstractos podemos encontrarlos en dos entidades, las clases abstractas y las interfaces.

Una clase abstracta no es más que una clase común la cual posee atributos, métodos, constructores y por lo menos un método abstracto. Una clase abstracta no puede ser instanciada, solo heredada.

Cómo Java no permite la herencia múltiple habrá ocasiones en las cuales debamos utilizar interfaces, las cuales podemos verlas como contratos, contratos donde está muy bien establecido que debe hacer la clase que la implementa.