Méthodes par défaut de Java 8 vs. méthodes non abstraites dans les classes abstraites
Java 8 interface par défaut des méthodes vs non-résumé des méthodes dans les classes abstraites - est-il des différences entre les deux (d'ailleurs les différences de iface - classe, la visibilité, etc.)
une méthode par défaut n'est-elle pas un pas en arrière dans Java, ce qui veut dire que C'est contre l'essence que Java annonce depuis des années?!
5 réponses
les méthodes non-abstraites dans les classes abstraites seront appelées lorsqu'il s'agit d'une sous-classe concrète appelée super() si elle est annulée. Il y a donc de multiples possibilités. Si la méthode n'est pas écrasée alors la méthode super class sera exécutée. si nous utilisons super () dans la méthode de la sous-classe béton, alors la méthode overridden avec la méthode de la classe super sera exécutée.
où les méthodes par défaut de L'interface Java 8 sont complètement différentes. Il a fourni un choix aux développeurs de mettre en œuvre la méthode dans la classe d'implémentation ou non. Si la fonction n'est pas implémentée alors, et seulement alors la méthode par défaut sera exécutée.
Cas D'Utilisation Possible:
le cas d'utilisation le plus important pour cette nouvelle fonctionnalité dans les bibliothèques JDK est la possibilité d'étendre les interfaces existantes sans casser les implémenteurs existants: ajouter une nouvelle méthode abstraite à une interface exigerait que toutes les classes d'implémentation mettent en œuvre cette nouvelle méthode.( Source)
l'important à garder à l'esprit est que les méthodes par défaut n'ont pas accès à l'état, seulement au comportement. Il est en fait un endroit idéal pour définir raisonnable, par défaut, le comportement.
Imaginez que vous avez une interface:
public interface Plant {
enum Pace { FAST, SLOW; }
void grow(Pace pace);
void growFast();
void growSlow();
}
Il semble raisonnable de prévoir un comportement par défaut:
default void growFast() { grow(Pace.FAST); }
default void growSlow() { grow(Pace.SLOW); }
ceci est un exemple simpliste mais montre comment les méthodes par défaut peuvent être utiles. Dans ce cas, le chemin growSlow
ou growFast
behaves fait partie de l'interface contrat donc il est logique de définir leur comportement au niveau de l'interface.
cependant l'interface ne fait aucune hypothèse sur la façon dont l'action "cultiver une plante" est mise en œuvre. Qui pourrait être défini dans une classe abstraite.
Premièrement, les méthodes par défaut vous permettent de ajouter de nouvelles méthodes pour se connecter sans casser les implémentations existantes.
prenez aussi un exemple de Collections
classe est une classe utilitaire pour Collection
interface à droite.
ainsi, en utilisant les méthodes par défaut, nous pouvons maintenant déplacer toutes les méthodes utilitaires comme implémentation par défaut dans le Collection
elle - même, ce qui aura plus de sens que de faire une classe séparée pour de tels services publics.
Aussi, vous serez en mesure de hériter des méthodes de multiples interfaces, ce qui n'aurait pas pu être fait en utilisant plain abstract
classes.
la grande différence est que le constructeur peut éventuellement être exécuté dans une classe anonyme, éventuellement, avec les exceptions. ceci empêche les classes anonymes d'être des interfaces fonctionnelles, et à leur tour les rend indisponibles à utiliser comme base pour une expression lambda.
Les principales différences sont: Les méthodes Java 8 par défaut des interfaces sont publiques, tandis que les méthodes non abstraites (concrètes) des classes abstraites peuvent être définies comme publiques, protégées ou privées. Les expressions Lambda ont été introduites en Java 8, pour utiliser les fonctionnalités lambda nous avons besoin de méthodes par défaut(pour préserver la compatibilité ascendante), les méthodes non abstraites des classes abstraites ne peuvent pas servir le but.