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
Birdet unAirplanepeuvent tous deux êtreFlyable. 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
Catet unDogétendent tous deuxAnimal, 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.