Les Interfaces ne peuvent pas avoir d'état qui leur sont associés.
Les classes abstraites peuvent avoir l'état associé avec eux.
En outre, les méthodes par défaut dans les interfaces n'ont pas besoin d'être mis en œuvre. Donc, dans cette façon, il ne se cassera pas déjà le code existant, en tant que bien que l'interface ne recevoir une mise à jour, la mise en œuvre de la classe n'a pas besoin de la mettre en œuvre.
Comme un résultat, vous pouvez obtenir des sous-optimale de code, mais si vous voulez avoir plus d'un code optimal, votre travail consiste à remplacer la valeur par défaut de mise en œuvre.
Et enfin, dans le cas d'un diamant problème se produit, alors le compilateur va vous avertir, et vous aurez besoin de choisir l'interface que vous souhaitez mettre en place.
Pour afficher plus au sujet de la diamond problème, considérons le code suivant:
interface A {
void method();
}
interface B extends A {
@Override
default void method() {
System.out.println("B");
}
}
interface C extends A {
@Override
default void method() {
System.out.println("C");
}
}
interface D extends B, C {
}
Ici, je reçois l'erreur de compilation sur interface D extends B, C
, que:
interface D inherits unrelated defaults for method() form types B and C
La solution est:
interface D extends B, C {
@Override
default void method() {
B.super.method();
}
}
Dans le cas où j'ai voulu hériter de la method()
de B
.
La même chose vaut pour s' D
ont un class
.
Pour montrer encore plus sur la différence entre les interfaces et les classes abstraites dans Java 8, considérez les points suivants Team
:
interface Player {
}
interface Team {
void addPlayer(Player player);
}
Vous pouvez, en théorie, fournir une implémentation par défaut de addPlayer
de telle sorte que vous pouvez ajouter des joueurs à par exemple une liste de joueurs.
Mais attendez...?
Comment dois-je stocker la liste des joueurs?
La réponse est que vous ne pouvez pas faire cela dans une interface, même si vous avez des implémentations par défaut disponibles.