Différence entre une interface et une classe abstraite en Java
Quelle est la différence entre une interface et une classe abstraite? Les deux sont utilisées pour réaliser l’abstraction où nous pouvons déclarer des méthodes abstraites, et les deux ne peuvent pas être instanciées.
Qu’est-ce que une interface?
Une interface peut être utilisé pour implémenter une classe. L’interface ne contient aucune méthode qui comporte du code. Toutes les méthodes d’une interface sont des méthodes abstraites.
Une interface ne peut pas être instanciée. En revanche, les classes qui implémentent des interfaces peuvent être instanciées. Les interfaces ne contiennent jamais de variables d’instance, mais peuvent contenir des variables « public static final ».
Exemple d’une interface en Java:
interface Animal { public void manger(); } class Chien implements Animal { public void manger() { System.out.println("Je mange"); } public static void main(String args[]) { Animal animal = new Chien(); animal.manger(); } }
Qu’est-ce qu’une classe abstraite?
Une classe dont le mot clé est « abstract » est appelée une classe abstraite. Les classes abstraites doivent avoir au moins une méthode abstraite, c’est-à-dire des méthodes sans corps. Il peut avoir plusieurs méthodes concrètes(méthodes qui ont du code).
Les classes abstraites vous permettent de créer des modèles pour des classes concrètes. Mais la classe qui hérite doit implémenter la méthode abstraite.
Les classes abstraites ne peuvent pas être instanciées.
Exemple d’une classe abstraite en Java:
abstract class Forme { int a = 10; abstract public void calculerSurface(); } public class Rectangle extends Forme { public static void main(String args[]) { Rectangle rect = new Rectangle(); rect.a = 20; rect.calculerSurface(); } public void calculerSurface() { System.out.println("Surface est " + (rect.a * rect.a)); } }
Table de comparaison
Une interface peut hériter un nombre illimité d’interfaces à la fois
interface Api extends i1, i2, i3 { // méthodes } |
Une classe abstraite ne peut hériter qu’une classe ou une classe abstraite à la fois.
abstract class A { // méthodes } abstract class B extends A { // méthodes } |
Les interfaces ne peuvent être héritées que par des interfaces. Les classes doivent les implémentées au lieu d’être héritées.
interface Api1{} interface Api2 extends Api1{} class MaClasse implements Api2{} |
Une classe abstraite peut hériter une autre classe concrète ou abstraite |
Une interface ne peut avoir que des méthodes abstraites
interface Api{ public abstract void lire(); } |
Une classe abstraite peut avoir des méthodes abstraites et concrètes
abstract class MaClasse { abstract void lire(); public void afficher(){ System.out.println("msg"); } } |
Dans une interface, le mot clé «abstract» est facultatif pour déclarer une méthode en tant que abstract. | Dans une classe abstraite, le mot clé «abstract» est obligatoire pour déclarer une méthode en tant qu’abstrait. |
Une interface ne peut avoir que des méthodes abstraites « public » | Une classe abstraite peut avoir des méthodes abstraites « protected » et « public » |
L’interface n’a pas de modificateurs d’accès. Tout ce qui est défini à l’intérieur de l’interface est supposé « public ». | La classe abstraite peut avoir un modificateur d’accès. |
Il est préférable d’utiliser l’interface lorsque plusieurs implémentations partagent uniquement la signature de méthode. | Il doit être utilisé lorsque différentes implémentations du même type partagent un comportement commun. |
L’interface ne peut pas contenir des propriétés. | La classe peut avoir des propriétés. |
Lorsque vous ne connaissez que les exigences et non son implémentation, vous utilisez une « Interface ». | Lorsque vous connaissez partiellement les implémentations, vous utilisez une « classe abstraite ». |