1. Quelle est la méthode par défaut et pourquoi devrait-il y avoir une méthode par défaut ?
Pour faire simple, une interface peut avoir des méthodes d’implémentation, et il n’est pas nécessaire qu’une classe d’implémentation implémente ses méthodes. Ajoutez simplement le mot-clé par défaut devant le nom de la méthode.
Pourquoi avons-nous besoin de cette fonctionnalité ? Tout d’abord, l’interface précédente est une arme à double tranchant. L’avantage est qu’elle est orientée vers l’abstraction plutôt que vers une programmation spécifique. L’inconvénient est que lorsque l’interface doit être modifiée, toutes les classes qui l’implémentent doivent l’être. . Le framework de collection actuel avant Java 8 ne dispose pas de méthode foreach. La solution généralement envisageable consiste à ajouter de nouvelles méthodes et implémentations aux interfaces pertinentes dans le JDK. Cependant, pour la version publiée, il n'existe aucun moyen d'ajouter de nouvelles méthodes à l'interface sans affecter l'implémentation existante. La méthode par défaut est donc introduite. Leur but est de résoudre le problème d'incompatibilité entre les modifications d'interface et les implémentations existantes.
Exemple simple : une interface A, la classe Clazz implémente l'interface A.
Copiez le code comme suit :
interface publique A {
par défaut void foo(){
System.out.println("Appel de A.foo()");
}
}
la classe publique Clazz implémente A {
public static void main (String[] args){
Clazz clazz = nouveau Clazz();
clazz.foo();//Appeler A.foo()
}
}
Le code se compile même si la classe Clazz n'implémente pas la méthode foo(). L'implémentation par défaut de la méthode foo() est fournie dans l'interface A.
2. Comparaison entre les classes abstraites et les interfaces dans Java 8
Après la sortie de cette fonctionnalité, de nombreux étudiants ont réagi. Les interfaces Java 8 ont des méthodes d'implémentation. Quelle est la différence entre elles et les classes abstraites ? En fait, il y en a encore, veuillez consulter le tableau ci-dessous pour comparaison. .
| Similitudes | Différences |
1. Ce sont tous des types abstraits ; 2. Tous peuvent avoir des méthodes d’implémentation (les interfaces ne fonctionnaient pas auparavant) ; 3. Vous pouvez implémenter toutes les méthodes sans implémenter de classes ou d'héritiers (cela n'était pas possible auparavant, désormais les méthodes par défaut de l'interface n'ont pas besoin d'être implémentées par l'implémenteur) | 1. Les classes abstraites ne peuvent pas avoir d'héritage multiple, les interfaces le peuvent (qu'il s'agisse d'héritage de types multiples ou d'héritage de comportements multiples) ; 2. Les classes et interfaces abstraites reflètent différents concepts de conception. En fait, les classes abstraites représentent la relation « est-un » et les interfaces représentent la relation « comme-un » ; 3. Les variables définies dans l'interface sont par défaut du type final statique public, et leur valeur initiale doit être donnée, elles ne peuvent donc pas être redéfinies dans la classe d'implémentation, ni leurs valeurs ne peuvent être modifiées par défaut dans la classe abstraite ; au type convivial, et leurs valeurs peuvent être spécifiées dans la sous-classe. Elles peuvent être redéfinies dans la classe ou réaffectées. |
3. Description du conflit d'héritage multiple
Puisque la même méthode peut être introduite à partir de différentes interfaces, des conflits se produiront naturellement. Les règles de détermination des conflits par les méthodes par défaut sont les suivantes :
1. Une méthode déclarée dans une classe est prioritaire sur toute méthode par défaut (les classes gagnent toujours)
2. Sinon, l'implémentation la plus spécifique sera sélectionnée en premier. Par exemple, dans l'exemple ci-dessous, B réécrit la méthode hello de A.
Le résultat est : Hello World de B
Si vous souhaitez appeler la fonction par défaut de A, utilisez la nouvelle syntaxe X.super.m(...). Ensuite, modifiez la classe C, implémentez l'interface A et réécrivez une méthode hello, comme indiqué ci-dessous :
Copiez le code comme suit :
la classe publique C implémente A{
@Outrepasser
public void bonjour(){
A.super.hello();
}
public static void main (String[] args){
new C().bonjour();
}
}
Le résultat est : Hello World de A
4. Résumé
La méthode par défaut nous offre la commodité de modifier l'interface sans détruire la structure de la classe d'implémentation d'origine. Actuellement, le framework de collection de Java 8 a largement utilisé les méthodes par défaut pour l'améliorer lorsque nous commençons enfin à utiliser l'expression lambdas. de Java 8, il est fourni pour Nous avons une expérience de transition en douceur. Peut-être verrons-nous davantage d’applications de méthodes par défaut dans la conception d’API à l’avenir.