Différence entre une interface et une classe abstraite en Java

Mohammad Irfan 12 octobre 2023
  1. Similitudes entre la classe abstraite et l’interface
  2. Différences entre la classe abstraite et l’interface
  3. Quand utiliser la classe abstraite et l’interface ?
  4. Classe abstraite en Java
  5. Interface en Java
  6. Classe abstraite implémentant une interface
  7. Sommaire
Différence entre une interface et une classe abstraite en Java

Ce tutoriel présente la différence entre une interface et une classe abstraite en Java et répertorie également quelques exemples de codes pour comprendre le sujet.

L’abstraction est le processus consistant à masquer l’implémentation et à ne fournir que les détails essentiels à l’utilisateur. L’abstraction en Java est réalisée via des classes abstraites et des interfaces. Les classes abstraites et les interfaces ont quelques points communs, mais il existe des différences majeures entre elles. Examinons d’abord certaines des choses qui sont similaires entre les deux.

Similitudes entre la classe abstraite et l’interface

  • Comme indiqué ci-dessus, la classe abstraite et l’interface sont utilisées pour l’abstraction.
  • Les classes abstraites et les interfaces ne peuvent pas être instanciées, c’est-à-dire que nous ne pouvons pas créer d’objet pour elles.
  • Les sous-classes doivent remplacer les méthodes abstraites définies dans la classe abstraite ou l’interface.

Les points ci-dessus résument à peu près les similitudes entre les deux. Examinons maintenant certaines des principales différences entre eux.

Différences entre la classe abstraite et l’interface

Classe abstraite Interface
Le mot-clé abstract en Java est utilisé pour créer ou déclarer une classe abstraite. En Java, le mot-clé interface est utilisé pour créer ou déclarer une nouvelle interface.
Une classe peut hériter des propriétés et méthodes d’une classe abstraite en utilisant le mot-clé extends. Pour implémenter une Interface en Java, on peut utiliser le mot-clé implements.
Une classe abstraite peut avoir des méthodes abstraites ou non abstraites définies en elle. Les méthodes abstraites sont celles pour lesquelles aucune implémentation n’est fournie. Une interface ne peut contenir que des méthodes abstraites. Nous ne pouvons fournir que la définition de la méthode mais pas son implémentation. Après Java 8, nous pouvons également avoir des méthodes par défaut et statiques dans les interfaces.
Une classe abstraite peut contenir des variables finales ou non finales (attributs de classe). Il peut également contenir des attributs statiques ou non statiques. Une interface ne peut contenir que des membres statiques et finaux, et aucun autre type de membre n’est autorisé.
Une classe abstraite peut implémenter une interface et implémenter les méthodes de l’interface. Une interface ne peut étendre aucune autre classe et ne peut pas surcharger ou implémenter des méthodes de classe abstraite.
Une classe abstraite peut étendre d’autres classes et peut également implémenter des interfaces. Comme discuté dans le point précédent, les interfaces ne peuvent pas étendre d’autres classes. Mais il n’y a aucune restriction dans l’implémentation d’une interface.
Java ne prend pas en charge les héritages multiples via des classes. Les classes abstraites, comme toute autre classe, ne prennent pas en charge les héritages multiples. La prise en charge des héritages multiples en Java est fournie via les interfaces. C’est parce que les interfaces fournissent une abstraction complète.
Les membres ou attributs de classe abstraits peuvent être privés, protégés ou publics. Les attributs ou les membres d’une Interface sont toujours publics.

Quand utiliser la classe abstraite et l’interface ?

Les classes abstraites peuvent fournir une abstraction partielle ou complète. Les interfaces, en revanche, fournissent toujours une abstraction complète. Une classe parent abstraite peut être créée pour quelques classes qui ont des fonctionnalités communes. Les classes abstraites sont également privilégiées si vous souhaitez plus de liberté d’action.

Les interfaces sont privilégiées lorsque l’on veut définir une structure de base. Le programmeur peut alors construire n’importe quoi avec cette structure. Les interfaces prennent également en charge les héritages multiples. Ainsi, une seule classe peut implémenter plusieurs interfaces.

Dans l’ensemble, c’est une question de choix et de la tâche qui doit être accomplie. La classe abstraite et l’interface conviennent à des fins différentes et doivent être utilisées en conséquence.

Classe abstraite en Java

Créons une classe abstraite et créons des classes enfants qui l’étendent pour comprendre la classe abstraite et ses fonctionnalités.

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();
  }
}

Production:

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

Interface en Java

Reproduisons le même scénario à l’aide d’interfaces. Nous ne pouvons plus définir de méthodes non abstraites dans l’interface. Interface est le bon choix si les classes ne souhaitent pas une implémentation commune des méthodes increaseVolume() et 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();
  }
}

Production:

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

Classe abstraite implémentant une interface

Comme discuté dans la section précédente, nous pouvons implémenter les méthodes d’une interface dans une classe abstraite. Le code suivant le démontre.

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");
  }
}

Sommaire

L’abstraction est l’un des concepts les plus fondamentaux utilisés dans la programmation orientée objet. L’abstraction est utilisée pour masquer l’implémentation et ne fournir que le minimum de détails essentiels à l’utilisateur. En Java, l’abstraction est réalisée en utilisant des classes abstraites ou des interfaces. Une différence majeure entre les deux est que les classes abstraites peuvent également fournir une abstraction partielle, tandis qu’Interface fournira toujours une abstraction complète. Dans ce didacticiel, nous avons discuté de certaines des principales différences entre les deux.

Article connexe - Java Interface