Bien que les deux mots-clés extends et implements en Java soient utilisés pour mettre en œuvre le concept d’héritage de la programmation orientée objet, il existe une différence subtile entre eux. Le mot-clé extends est principalement utilisé pour étendre une classe c’est-à-dire pour créer une sous-classe en Java, tandis que le mot-clé implements est utilisé pour implémenter une interface en Java. Le mot-clé extends peut également être utilisé par une interface pour étendre une autre interface. Afin de mieux comprendre la différence entre extends et implements, vous devez également apprendre et comprendre la différence entre classe et interface en Java.
Bien que les deux fassent partie intégrante du développement d’applications utilisant la méthodologie orientée objet, une interface est plus abstraite que la classe donc elle est utilisée pour définir l’API ou le contrat.
D’autre part, une classe fournit l’implémentation concrète de l’interface c’est-à-dire le code réel qui fait le travail. Bien qu’une classe puisse aussi être abstraite pour définir un contrat, c’est le travail qui est le mieux fait par une interface en Java. Même Joshua Bloch a conseillé dans Effective Java d’utiliser des interfaces pour déclarer le type en Java, car cela favorise les héritages multiples en Java, ce qui est restreint par rapport à C++.
Même après Java 8, seuls les héritages multiples du type et du comportement sont supportés en Java (en introduisant des méthodes par défaut dans Java 8), mais les héritages multiples de l’état ne sont toujours pas supportés. Si vous voulez en savoir plus sur la raison pour laquelle les héritages multiples ne sont pas pris en charge dans Java, voir ici.
Et, si vous êtes nouveau dans le monde Java, alors je vous recommande également de passer par The Complete Java MasterClass sur Udemy pour apprendre Java d’une manière meilleure et plus structurée. C’est l’un des meilleurs cours à jour pour apprendre Java en ligne.

Quel est le sens d’étendre une classe

Une classe en Java peut étendre une autre classe pour devenir une sous-classe. Lorsque la classe B étend la classe A, B devient une sous-classe (enfant) et A devient une super-classe (parent). Une sous-classe peut réutiliser toutes les fonctionnalités de la classe parent et la réutilisation du code est une raison majeure pour étendre une classe mais peu comprennent que plus important est la relation de définition qui est plus tard exploitée par le Polymorphisme.
Par exemple, si la classe B étend la classe A alors une variable de référence de type A peut contenir l’objet de B, ce qui signifie que A devient maintenant polymorphe car elle peut contenir à la fois A et B. Cela donne naissance à une technique de création de logiciels flexibles, connue sous le nom de programmation pour l’interface que la mise en œuvre où vous utilisez toujours les variables de la classe ou de l’interface parent pour définir l’algorithme de base.

L’avantage de faire cela est que toute nouvelle classe qui étend la classe parent aura accès à cet algorithme.
Voici un exemple d’extension d’une classe en Java:

classe A { public void show() { System.out.println("show") ; }}classe B extends A { public void display() { System.out.println("display") ; } public void show() { System.out.println("better show") ; }}public class Main { public static void main(String args) { A a = new B() ; // possible car B extends A.show() ; // ceci appellera maintenant la méthode show() de la classe B }}Outputbetter show

Vous pouvez voir qu’en étendant la classe A, B a maintenant accès à la méthode show(), elle peut même surcharger le comportement de la méthode show(), ce qui est connu sous le nom de method overriding en Java. Cet immense pouvoir vient de l’utilisation du mot-clé extends.
Vous pouvez également lire le Head First Design Pattern in Java pour en savoir plus sur la technique de programmation pour l’interface que pour la mise en œuvre. Le livre est également récemment mis à jour pour couvrir Java SE 8.

Quel est le sens de la mise en œuvre d’une interface

Le sens de la mise en œuvre d’une interface n’est pas très différent de l’extension d’une classe, mais il vient avec une mise en garde supplémentaire. Lorsqu’une classe implémente une interface, elle doit fournir une implémentation de toutes les méthodes déclarées dans l’interface. Si elle ne souhaite pas fournir toutes les implémentations, elle peut se déclarer comme une classe abstraite.
Ne pas suivre ces règles signifie que votre programme ne peut pas compiler. Il existe de nombreux exemples de mise en œuvre d’une interface dans le code Java, mais je crois que la mise en œuvre de Runnable est la plus populaire. Ceci est utilisé pour créer une tâche Runnable qui peut être exécutée par un thread.

class R implements Runnable{public void run(){ System.out.println("do nothing") ; }}

Une instance de R peut maintenant être passée à n’importe quelle méthode qui attend un Runnable comme vous pouvez passer ceci à la fois à la méthode execute() et submit() de la classe ExecutorService pour exécuter cette tâche dans un pool de threads. Puisque notre classe a implémenté la méthode run(), la seule méthode de l’interface Runnable, elle est une classe concrète. Si elle n’avait pas implémenté la méthode run(), vous devez la rendre abstraite en ajoutant le mot clé abstract devant class par exemple.

classe abstraite R implémente Runnable{}

Points importants

Voici quelques-uns des points importants liés au mot-clé extends et implements en Java :

1) Une classe ne peut qu’étendre une autre classe en Java, l’utilisation du mot clé extends avec l’interface entraînera une erreur de compilation comme indiqué ci-dessous:

interface I{}classe A{}classe B extends A{}classe C extends I{}

Lorsque vous compilez ce fichier source, vous obtiendrez l’erreur suivante:

$ javac Main.javaMain.java:27 : no interface expected hereclass C extends I{^1 error

2) Une classe ne peut étendre qu’une seule classe, essayer d’étendre plus que la classe résultera à nouveau en une erreur de compilation comme indiqué ci-dessous:

class C extends A, B{}$ javac Main.javaMain.java:27 : '{' expectedclass C extends A, B{^1 error

3) Une interface peut utiliser le mot clé extends pour créer des sous-interfaces en Java e.g. ce qui suit est parfaitement légal en Java

interface J extends I{}

4) Une interface peut même étendre plusieurs interfaces en utilisant le mot clé extends comme indiqué ci-dessous:

interface k extends I, J{}

5) Une classe peut utiliser le mot clé implements pour mettre en œuvre une ou plusieurs interfaces en Java comme indiqué ci-dessous :

classe D implémente I, J, K{}

6) Une classe peut également utiliser les deux mots-clés extends et implements ensemble pour étendre une classe et implémenter une interface, c’est assez commun en Java comme le montre l’exemple suivant :

classe E extends A implements I, J{}

Quand une classe fait cela, elle est maintenant une sous-classe de A et une sous-interface de I et J, ce qui signifie que vous pouvez utiliser une variable de référence de la classe E et de l’interface I, J pour stocker l’objet de la classe E comme indiqué ci-dessous :

I i = new E();J j = new E();A a = new E();

Cela donne un immense pouvoir à la classe E en termes d’utilisation de l’Héritage et du Polymorphisme.
7) Last but not the least, une interface ne peut pas utiliser le mot-clé implements pour implémenter une interface, c’est illégal en Java et le compilateur lancera une erreur comme indiqué ci-dessous :

interface L implements J{}javac Main.javaMain.java:49 : '{' expectedinterface L implements J{^1 error

C’est tout sur la différence entre extends et implements mot-clé en Java. Il est clair que extends est généralement utilisé pour étendre une classe et implements sont généralement utilisés pour mettre en œuvre une interface. Bien qu’il y ait plus de subtilités, par exemple, une interface peut également étendre une autre interface pour devenir une sous-interface, une classe peut également être abstraite même après avoir implémenté une interface, mais ce qui ne change pas, c’est qu’ils sont tous deux utilisés pour créer la relation parent-enfant en Java.
Si la classe B étend une autre classe A, elle devient ses enfants et la classe A devient un parent. Il en va de même avec l’interface. Vous pouvez en outre lire Head First Java et Head First Object-Oriented Analysis pour en savoir plus sur les blocs de construction de base de la programmation orientée objet en java.
Autres questions d’entretien Java que vous pourriez aimer

  • La différence entre agrégation, association et composition en Java ? (réponse)
  • La différence entre classe abstraite et interface en Java ? (réponse)
  • La différence entre Héritage et Polymorphisme en Java ? (réponse)
  • La différence entre Abstraction et Polymorphisme en Java ? (réponse)
  • Pourquoi la Composition est meilleure que l’Héritage en Java ? (article)
  • La différence entre les variables statiques et non statiques en Java ? (réponse)
  • Pourquoi la classe abstraite est importante en Java ? (avis)

Plus d’infos
Cours complet de maîtrise de Java
Fondamentaux de Java : Le langage Java
Java en profondeur : Devenez un ingénieur Java complet!

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.