Diferencia entre una interfaz y una clase abstracta en Java

Mohammad Irfan 12 octubre 2023
  1. Similitudes entre la clase abstracta y la interfaz
  2. Diferencias entre clase abstracta e interfaz
  3. ¿Cuándo usar la clase abstracta y la interfaz?
  4. Clase abstracta en Java
  5. Interfaz en Java
  6. Clase abstracta implementando una interfaz
  7. Resumen
Diferencia entre una interfaz y una clase abstracta en Java

Este tutorial presenta la diferencia entre una interfaz y una clase abstracta en Java y también enumera algunos códigos de ejemplo para comprender el tema.

La abstracción es el proceso de ocultar la implementación y solo proporcionar detalles esenciales al usuario. La abstracción en Java se logra a través de clases abstractas e interfaces. Las clases abstractas y las interfaces tienen algunas cosas en común, pero existen grandes diferencias entre ellas. Primero veamos algunas de las cosas que son similares entre los dos.

Similitudes entre la clase abstracta y la interfaz

  • Como se discutió anteriormente, tanto la clase abstracta como la interfaz se utilizan para la abstracción.
  • Las clases e interfaces abstractas no se pueden instanciar, es decir, no podemos crear un objeto para ellas.
  • Las subclases deben invalidar los métodos abstractos definidos en la clase o interfaz abstracta.

Los puntos anteriores resumen bastante bien las similitudes entre los dos. Veamos ahora algunas de las diferencias clave entre ellos.

Diferencias entre clase abstracta e interfaz

Clase abstracta Interfaz
La palabra clave abstract en Java se utiliza para crear o declarar una clase abstracta. En Java, la palabra clave interface se utiliza para crear o declarar una nueva interfaz.
Una clase puede heredar las propiedades y los métodos de una clase abstracta utilizando la palabra clave extends. Para implementar una interfaz en Java, podemos usar la palabra clave implements.
Una clase abstracta puede tener métodos abstractos o no abstractos definidos en ella. Los métodos abstractos son los que no tienen ninguna implementación prevista para ellos. Una interfaz solo puede tener métodos abstractos. Solo podemos proporcionar la definición del método, pero no su implementación. Después de Java 8, también podemos tener métodos predeterminados y estáticos en Interfaces.
Una clase abstracta puede contener variables finales o no finales (atributos de clase). También puede contener atributos estáticos o no estáticos. Una interfaz solo puede contener miembros estáticos y finales, y no se permite ningún otro tipo de miembro.
Una clase abstracta puede implementar una interfaz e implementar los métodos de la interfaz. Una interfaz no puede extender ninguna otra clase y no puede anular o implementar métodos de clase abstracta.
Una clase abstracta puede ampliar otras clases y también puede implementar interfaces. Como se discutió en el punto anterior, las interfaces no pueden extender otras clases. Pero no hay ninguna restricción para implementar una interfaz.
Java no admite herencias múltiples a través de clases. Las clases abstractas, al igual que cualquier otra clase, no admiten herencias múltiples. El soporte para múltiples herencias en Java se proporciona a través de interfaces. Esto se debe a que las interfaces proporcionan una abstracción completa.
Los miembros o atributos de la clase abstracta pueden ser privados, protegidos o públicos. Los atributos o miembros de una interfaz son siempre públicos.

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

Las clases abstractas pueden proporcionar abstracción parcial o total. Las interfaces, por otro lado, siempre proporcionan una abstracción completa. Se puede crear una clase padre abstracta para algunas clases que tienen algunas funcionalidades comunes. También se prefieren las clases abstractas si desea más libertad de acción.

Se prefieren las interfaces cuando queremos definir una estructura básica. El programador puede entonces construir cualquier cosa con esta estructura. Las interfaces también admiten múltiples herencias. Entonces, una sola clase puede implementar múltiples interfaces.

En general, es una cuestión de elección y la tarea que se debe realizar. Tanto la clase abstracta como la interfaz son adecuadas para diferentes propósitos y deben usarse en consecuencia.

Clase abstracta en Java

Creemos una clase abstracta y creemos clases secundarias que la amplíen para comprender la clase abstracta y sus funcionalidades.

abstract class Bell {
  protected String sound;

  Bell() {
    this.sound = "ting";
  }
  // Abstract Method
  abstract public void ring();

  // Non-Abstract Methods
  public void increaseVolume() {
    System.out.println("Increasing Volume");
  }

  public void decreaseVolume() {
    System.out.println("Decreasing Volume");
  }
}
class SchoolBell extends Bell {
  @Override
  public void ring() {
    System.out.println("Ringing the School bell: " + sound);
  }
}
class ChruchBell extends Bell {
  @Override
  public void ring() {
    System.out.println("Ringing the Chruch Bell: " + sound);
  }
}
public class AbstractClassDemo {
  public static void main(String[] args) {
    SchoolBell sb = new SchoolBell();
    ChruchBell cb = new ChruchBell();

    // Using the overridden methods
    sb.ring();
    cb.ring();

    // Using the non-abstract methods of Bell class
    sb.increaseVolume();
    cb.decreaseVolume();
  }
}

Producción :

Ringing the School bell: ting
Ringing the Chruch Bell: ting
Increasing Volume
Decreasing Volume

Interfaz en Java

Repliquemos el mismo escenario usando interfaces. Ya no podemos definir métodos no abstractos en la interfaz. La interfaz es la elección correcta si las clases no quieren una implementación común de los métodos increaseVolume() y decreaseVolume().

interface Bell {
  String sound = "ting";
  // only abstract methods allowed in interface
  public void ring();
  public void increaseVolume();
  public void decreaseVolume();
}
class SchoolBell implements Bell {
  public void ring() {
    System.out.println("Ringing the School bell: " + sound);
  }
  @Override
  public void increaseVolume() {
    System.out.println("Increasing Volume of School Bell");
  }
  @Override
  public void decreaseVolume() {
    System.out.println("Decreasing Volume of School Bell");
  }
}
class ChruchBell implements Bell {
  public void ring() {
    System.out.println("Ringing the Chruch Bell: " + sound);
  }
  @Override
  public void increaseVolume() {
    System.out.println("Increasing Volume of Chruch Bell");
  }
  @Override
  public void decreaseVolume() {
    System.out.println("Decreasing Volume of Chruch Bell");
  }
}
public class InterfaceDemo {
  public static void main(String[] args) {
    SchoolBell sb = new SchoolBell();
    ChruchBell cb = new ChruchBell();

    // Using the overridden methods
    sb.ring();
    cb.ring();

    // Using the non-abstract methods of Bell class
    sb.increaseVolume();
    cb.decreaseVolume();
  }
}

Producción :

Ringing the School bell: ting
Ringing the Chruch Bell: ting
Increasing Volume of School Bell
Decreasing Volume of Chruch Bell

Clase abstracta implementando una interfaz

Como se discutió en la sección anterior, podemos implementar los métodos de una interfaz en una clase abstracta. El siguiente código demuestra esto.

interface Bell {
  String sound = "ting";
  // only abstract methods allowed in interface
  public void ring();
  public void increaseVolume();
  public void decreaseVolume();
}
abstract class AbstractBell implements Bell {
  public void increaseVolume() {
    System.out.println("Increasing Volume");
  }
  public void decreaseVolume() {
    System.out.println("Decreasing Volume");
  }
}

Resumen

La abstracción es uno de los conceptos más fundamentales utilizados en la programación orientada a objetos. La abstracción se utiliza para ocultar la implementación y solo proporcionar los detalles mínimos esenciales al usuario. En Java, la abstracción se logra mediante el uso de clases abstractas o interfaces. Una diferencia importante entre los dos es que las clases abstractas también pueden proporcionar una abstracción parcial, mientras que Interface siempre proporcionará una abstracción completa. En este tutorial, discutimos algunas de las diferencias clave entre los dos.

Artículo relacionado - Java Interface