Diferencia entre clase abstracta e interfaz en Java

Diferencia clave entre clase abstracta e interfaz en Java

  • En Interface, una clase puede implementar múltiples interfaces, mientras que la clase puede heredar solo una clase abstracta.
  • En Interfaz no tiene modificadores de acceso. Se supone que todo lo definido dentro de la Interfaz tiene un modificador público, mientras que la Clase Abstracta puede tener un modificador de acceso.
  • La interfaz no puede contener campos de datos, mientras que la clase abstracta puede tener campos de datos.
  • Las interfaces ayudan a definir las habilidades periféricas de una clase, mientras que una clase abstracta define la identidad de una clase.

Interfaz vs clase abstracta en Java

¿Qué es una clase abstracta?

Una clase que tiene la palabra clave abstract en su declaración se llama clase abstracta. Las clases abstractas deben tener cero o más métodos abstractos, es decir, métodos sin cuerpo. Puede tener múltiples métodos concretos. Las clases abstractas le permiten crear planos para clases concretas. Pero la clase heredada debe implementar el método abstracto. Las clases abstractas no se pueden instanciar.

Razones importantes para utilizar interfaces

  • Las interfaces se utilizan para lograr abstracción.
  • Diseñado para admitir la resolución de métodos dinámicos en tiempo de ejecución
  • Le ayuda a lograr un acoplamiento flojo.
  • Le permite separar la definición de un método de la jerarquía de herencia.

Razones importantes para utilizar la clase abstracta

  • Las clases abstractas ofrecen funcionalidad predeterminada para las subclases.
  • Proporciona una plantilla para futuras clases específicas.
  • Le ayuda a definir una interfaz común para sus subclases.
  • La clase abstracta permite la reutilización del código.

¿Qué es una interfaz?

La interfaz es un modelo que se puede utilizar para implementar una clase. La interfaz no contiene ningún método concreto (métodos que tienen código). Todos los métodos de una interfaz son métodos abstractos. No se puede crear una instancia de una interfaz. Sin embargo, sí se pueden crear instancias de clases que implementan interfaces. Las interfaces nunca contienen variables de instancia, pero pueden contener variables finales públicas estáticas (es decir, variables de clase constantes).

Diferencia entre interfaz y clase abstracta en Java

Una clase abstracta le permite crear funciones que las subclases pueden implementar o anular, mientras que una interfaz solo le permite indicar la funcionalidad pero no implementarla. Una clase puede extender solo una clase abstracta, mientras que una clase puede implementar múltiples interfaces.

parámetros Fácil de usar Clase abstracta
Velocidad Lenta Rápido
Herencias Múltiples Implementar varias interfaces Sólo una clase abstracta
Estructura Métodos abstractos Métodos abstractos y concretos.
Cuándo usarlos Mejora futura Para evitar la independencia
Herencia/Implementación Una clase puede implementar múltiples interfaces La clase puede heredar solo una clase abstracta.
Implementación predeterminada Al agregar cosas nuevas a la interfaz, es una pesadilla encontrar todos los implementadores e implementar cosas recién definidas. En el caso de la clase abstracta, puede aprovechar la implementación predeterminada.
Modificadores de acceso La interfaz no tiene modificadores de acceso. Todo lo definido dentro de la interfaz se supone un modificador público. La clase abstracta puede tener un modificador de acceso.
Cuándo usarlos Es mejor utilizar la interfaz cuando varias implementaciones comparten únicamente la firma del método. Jerarquía polimórfica de tipos de valores. Debe usarse cuando varias implementaciones del mismo tipo comparten un comportamiento común.
Campos de información la interfaz no puede contener campos de datos. la clase puede tener campos de datos.
Valor predeterminado de herencia múltiple Una clase puede implementar numerosas interfaces. Una clase hereda sólo una clase abstracta.
Implementación Una interfaz es abstracta por lo que no puede proporcionar ningún código. Una clase abstracta puede proporcionar un código predeterminado completo que debe anularse.
Uso de modificadores de acceso No puede utilizar modificadores de acceso para el método, propiedades, etc. Puede utilizar una clase abstracta que contenga modificadores de acceso.
Uso Las interfaces ayudan a definir las habilidades periféricas de una clase. Una clase abstracta define la identidad de una clase.
Campos definidos No se pueden definir campos Una clase abstracta le permite definir campos y constantes.
Herencia Una interfaz puede heredar varias interfaces pero no puede heredar una clase. Una clase abstracta puede heredar una clase y múltiples interfaces.
Constructor o destructores Una interfaz no puede declarar constructores ni destructores. Una clase abstracta puede declarar constructores y destructores.
Límite de extensiones Puede ampliar cualquier número de interfaces. Sólo puede extender una clase o una clase abstracta a la vez.
Palabra clave abstracta En una palabra clave de interfaz abstracta, es opcional para declarar un método como abstracto. En una clase abstracta, la palabra clave abstract es obligatoria para declarar un método como abstracto.
Tipo de clase Una interfaz sólo puede tener métodos abstractos públicos. Una clase abstracta tiene métodos abstractos públicos y protegidos.

Código de muestra para interfaz y clase abstracta en Java

A continuación se muestra un código de muestra para crear una interfaz y una clase abstracta en Java

Sintaxis de la interfaz

interface name{
//methods
}

Java Ejemplo de interfaz:

interface Pet {
    public void test();
}
class Dog implements Pet {
    public void test() {
        System.out.println("Interface Method Implemented");
    }
    public static void main(String args[]) {
        Pet p = new Dog();
        p.test();
    }
}

Sintaxis de clase abstracta

abstract class name{
    // code
}

Ejemplo de clase abstracta:

abstract class Shape {
    int b = 20;
    abstract public void calculateArea();
}

public class Rectangle extends Shape {
    public static void main(String args[]) {
        Rectangle obj = new Rectangle();
        obj.b = 200;
        obj.calculateArea();
    }
    public void calculateArea() {
        System.out.println("Area is " + (b * b));
    }
}