Clase abstracta vs. Interfaz en Java: Explicación con Ejemplos

Las clases e interfaces abstractas se utilizan para la abstracción en Java. La abstracción en la programación orientada a objetos se refiere a ocultar los detalles de implementación a los usuarios finales.

En abstracción, puede saber cuáles son las funcionalidades, pero no puede saber cómo se implementaron.

Veamos cada uno de ellos y tratemos de entender por qué se usan.

Clase abstracta

Una clase que no se puede instanciar como un objeto y que puede tener o no métodos abstractos se denomina clase abstracta en Java. Un método abstracto es un método que no tiene un cuerpo de implementación cuando se declara.

Ejemplo de una clase abstracta GraphicObject – Oracle

Puede crear una clase abstracta especificando la palabra clave abstracta antes de la palabra clave de clase.

abstract class abstractClass {
    void run() {
        System.out.println("ran");
    }
}

Una clase abstracta puede ser extendida por otras clases. En otras palabras, también se puede subclasificar.

abstract class AbstractClass {
    void run() {
        System.out.println("ran");
    }
}

class ExtendingAbstractClass extends AbstractClass {
    void newMethod() {
        System.out.println("new");
    }

    @Override
    void run() {
        System.out.println("override");
    }
}

Las clases abstractas se utilizan para implementar métodos comunes entre varias clases que amplían una clase abstracta determinada. Además, la capacidad de definir métodos abstractos dentro de clases abstractas los hace increíblemente útiles para las clases que tienen métodos similares pero con diferentes implementaciones. Tomemos un ejemplo.

Considere un automóvil que tiene algunas funcionalidades, como arranque, parada, marcha atrás, etc. Estas funcionalidades son comunes entre todos los tipos de automóviles.

Pero, ¿qué pasa con las funcionalidades de automatización como la conducción autónoma? La implementación de esas funcionalidades puede diferir para diferentes tipos de automóviles. Veamos cómo puede crear un programa orientado a objetos relacionado con él.

En primer lugar, cree una clase de automóvil que se ampliará con múltiples clases de diferentes tipos de automóviles.

abstract class Car {
    void start() {
        // implementation
        System.out.println("runs car");
    }

    void stop() {
        // implementation
        System.out.println("engine stops");
    }

    void reverse() {
        // implementation
        System.out.println("reverse mode enabled");
    }

    abstract void selfDrive();
}

Los métodos start(), stop() y reverse() son métodos que son comunes en todos los automóviles. Por lo tanto, su implementación ya está definida dentro de la propia clase Car. Sin embargo, un determinado tipo de automóvil puede tener diferentes implementaciones del modo de conducción autónoma. Y, por lo tanto, puede definir selfDrive() como un método abstracto e implementarlo de diferentes maneras en diferentes clases de diferentes tipos de automóviles.

class CarTypeA extends Car {
    @Override
    void start() {
        super.start();
    }

    @Override
    void stop() {
        super.stop();
    }

    @Override
    void reverse() {
        super.reverse();
    }

    void selfDrive() {
        // custom implementation
        System.out.println("Type A self driving mode enabled");
    }
}
class CarTypeB extends Car {
    // ...all similar methods

    void selfDrive() {
        // custom implementation
        // different implementation than CarTypeB
        System.out.println("Type B self driving mode enabled");
    }
}

Es importante tener en cuenta que, si una subclase no implementa todos los métodos abstractos definidos en la clase abstracta, entonces debe declararse como una clase abstracta.

Interfaz

Una interfaz es una forma de decirle a una clase qué métodos debe implementar. Por ejemplo, si considera el ejemplo de un automóvil, tiene algunas funciones básicas. Puede arrancar, moverse y detenerse. Estas funciones son comunes en todos los coches.

Entonces, si implementa una interfaz de un automóvil en una clase, debe implementar todos los métodos para que el automóvil funcione de manera adecuada y segura.

Al igual que las clases abstractas, no podemos instanciar o crear objetos de una interfaz. Puede considerarse una clase completamente abstracta porque contiene solo métodos abstractos, es decir, métodos sin un cuerpo de implementación.

Puede crear una interfaz utilizando la palabra clave de interfaz.

interface CAR {
    void start();
    void stop();
    void move();
}

Implemente una interfaz utilizando la palabra clave implements al definir una clase.

class CarTypeB implements CAR {
    public void start() {
        System.out.println("started");
    }

    public void stop() {
        System.out.println("stopped");
    }

    public void move() {
        System.out.println("running");
    }
}

Semejanza

Ninguna instanciación como objeto es lo único que tienen en común las clases abstractas y las interfaces.

diferencias

Interfaz de clase abstracta Herencia e implementación Una clase solo puede heredar una clase abstracta. Una clase puede implementar varias interfaces. Tipos de variables Puede tener variables finales, no finales, estáticas y no estáticas. Solo puede tener variables estáticas y finales. Tipos de métodos Puede contener tanto métodos abstractos como no abstractos. Solo puede contener métodos abstractos, pero los métodos estáticos son una excepción. Modificadores de acceso Una clase abstracta puede tener un modificador de acceso. Las firmas de métodos definidas en la interfaz son públicas de forma predeterminada. Una interfaz no tiene un modificador de acceso. Constructores y Destructores Puede declarar constructores y destructores. No puede declarar constructores o destructores. Velocidad Rápido Lento Diferencias entre clase abstracta e interfaz

¿Cuándo usar la clase abstracta y la interfaz?

Use clases abstractas cuando:

  • Desea compartir algunos métodos y campos comunes entre varias clases.
  • Declarar campos no estáticos y no finales para modificar el estado del objeto al que están vinculados.

Puede utilizar interfaces cuando:

  • Desea definir el comportamiento de una clase que implementa la interfaz, pero no le importa la forma en que se implementa.
  • Desea asegurarse de que una clase implemente todos los métodos para funcionar correctamente.

Ultimas palabras

Las interfaces se utilizan principalmente para crear API porque pueden proporcionar una estructura para implementar la funcionalidad sin preocuparse por la implementación real.

Las clases abstractas se utilizan generalmente para compartir métodos abstractos y no abstractos comunes entre varias clases, lo que amplía la clase abstracta para que el código sea más reutilizable.

Obtenga más información sobre Java con la ayuda de estos cursos en línea para Java. ¿Te estás preparando para una entrevista en Java? Aquí hay algunas preguntas de la entrevista sobre Programación Orientada a Objetos.