Menu

Les interfaces en Java : définir des contrats et implements

Ce qu'est une interface en Java, comment la définir et l'implémenter, les méthodes default et static, et en quoi les interfaces diffèrent des classes abstraites.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Une interface est un contrat

Une interface déclare *ce qu'*une classe peut faire sans dire comment. C'est une liste de signatures de méthodes que toute classe qui l'implémente s'engage à respecter. L'enjeu, c'est le découplage : le code peut travailler avec le type de l'interface sans se soucier de la classe concrète qui se trouve derrière.

Circle implements Shape signifie que Circle doit définir area et perimeter. Une fois que c'est fait, un Circle est une Shape et peut être stocké dans une variable de type Shape.

Plusieurs classes, un seul type

La puissance apparaît lorsque plusieurs classes sans lien entre elles implémentent la même interface. Le code écrit pour Shape les gère toutes :

La boucle ne demande jamais « est-ce un Circle ou un Rectangle ? » - elle appelle simplement area() et fait confiance au contrat. Ajouter un Triangle plus tard ne nécessite aucune modification ici.

Implémenter plusieurs interfaces

Une classe n'étend qu'une seule classe, mais elle peut implémenter un nombre quelconque d'interfaces - c'est ainsi que Java réalise en toute sécurité l'« héritage multiple » de comportement :

Énumérez les interfaces séparées par des virgules après implements. La classe doit toutes les satisfaire.

Méthodes default et static

Depuis Java 8, une interface peut contenir des corps de méthode. Une méthode default donne aux classes qui l'implémentent une implémentation toute prête qu'elles héritent gratuitement (et peuvent redéfinir) :

Les méthodes default permettent à une interface d'évoluer - ajouter une méthode sans casser tous les implémenteurs existants. Une méthode d'interface static, en revanche, est un utilitaire que vous appelez sur l'interface elle-même, comme Comparator.naturalOrder().

Constantes

Les champs d'une interface sont implicitement public static final - ce sont des constantes, pas un état d'instance :

interface Physics {
    double GRAVITY = 9.81;   // automatically public static final
}

Les interfaces ne conservent traditionnellement aucun état par objet ; l'absence de champs d'instance fait partie de ce qui les distingue des classes.

Interfaces fonctionnelles

Une interface possédant exactement une méthode abstraite est une interface fonctionnelle, et vous pouvez l'implémenter avec une expression lambda plutôt qu'avec une classe entière :

C'est le fondement des lambdas de Java et des types de java.util.function (Function, Predicate, Supplier et consorts). L'annotation @FunctionalInterface rend l'intention explicite et permet au compilateur d'imposer la règle de la méthode unique.

Interface contre classe abstraite

Les deux vous permettent de programmer face à une abstraction, alors quand choisir l'une ou l'autre ?

  • Interface - une capacité que des classes sans lien entre elles peuvent partager. Un Bird et un Airplane peuvent tous deux être Flyable. Une classe peut en implémenter plusieurs. Pas d'état d'instance.
  • Classe abstraite - un état et du code partagés entre des classes étroitement liées. Un Cat et un Dog étendent tous deux Animal, héritant de champs communs et de méthodes partiellement implémentées. Une classe n'en étend qu'une seule.

Un schéma courant combine les deux : une interface définit le contrat, et une classe abstraite implémente les parties répétitives, de sorte que les sous-classes concrètes ne renseignent que les détails spécifiques.

Suite : les classes abstraites

Les interfaces définissent un comportement sans état. Les classes abstraites se situent entre les interfaces et les classes complètes - elles peuvent déclarer des méthodes non implémentées et porter des champs et des constructeurs. C'est le sujet de la page suivante.

Questions fréquentes

Qu'est-ce qu'une interface en Java ?

Une interface est un contrat : un ensemble de signatures de méthodes (et de constantes) qu'une classe s'engage à fournir. Elle dit ce qu'une classe peut faire, pas comment. Une classe utilise le mot-clé implements pour adopter une interface et doit fournir un corps pour chaque méthode abstraite que l'interface déclare. Les interfaces permettent à des classes sans lien entre elles d'être utilisées de façon interchangeable à travers un type partagé.

Quelle est la différence entre une interface et une classe abstraite en Java ?

Une classe peut implémenter plusieurs interfaces mais ne peut étendre qu'une seule classe (abstraite). Les interfaces ne conservent traditionnellement aucun état d'instance et ne déclarent que du comportement, tandis qu'une classe abstraite peut avoir des champs, des constructeurs et une logique partiellement implémentée. Utilisez une interface pour définir une capacité que plusieurs classes sans lien entre elles peuvent partager ; utilisez une classe abstraite pour partager un état et du code communs entre des sous-classes étroitement liées.

Une interface Java peut-elle avoir des corps de méthode ?

Oui, depuis Java 8. Les méthodes d'interface marquées default fournissent un corps que les classes qui l'implémentent héritent (et peuvent redéfinir), et les méthodes d'interface static offrent un comportement utilitaire appelable sur l'interface elle-même. Les méthodes d'interface ordinaires restent abstraites -juste une signature- et les classes qui l'implémentent doivent les définir.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER