J'apprenais à travers les interfaces lorsque j'ai remarqué que vous pouvez désormais définir des méthodes statiques et par défaut dans une interface.
public interface interfacesample2 {
public static void method() {
System.out.println("hello world");
}
public default void menthod3() {
System.out.println("default print");
}
}
Veuillez expliquer la différence des deux et aussi s'il y a un exemple de quand nous l'utiliserions, ce serait bien. Un peu confus sur les interfaces.
default implementation
d'une méthode qui peut être remplacée.Réponses:
Différences entre les méthodes statiques et par défaut dans Java 8:
1) Les méthodes par défaut peuvent être remplacées lors de l'implémentation de la classe, tandis que statiques ne peut pas .
2) La méthode statique appartient uniquement à la classe Interface, vous ne pouvez donc appeler la méthode statique que sur la classe Interface, pas sur la classe implémentant cette Interface, voir:
3) La classe et l'interface peuvent avoir des méthodes statiques avec les mêmes noms, et aucune ne remplace les autres!
la source
purpose
( utilisez une implémentation commune ) et résout l'ambiguïté enimplementing the logic again in subclass
( écrasant, masquant ). la seule raison raisonnable serait due à la raison pour laquelle [les méthodes d'interface statiques ne sont pas héritées] ( stackoverflow.com/questions/25169175/… ) et donc nous ne pouvons pas les appeler en utilisant une instance de sous-classe.Une méthode statique est une méthode qui s'applique à la classe «namespace», pour ainsi dire. On accède donc à une
static
méthodefoo
d'interfaceInterface
parInterface.foo()
. Notez que l'appel de fonction ne s'applique à aucune instance particulière de l'interface.Une implémentation par défaut
bar
, d'autre part, est appelée parUne
static
méthode d'interface ne peut pas connaître lathis
variable, mais une implémentation par défaut le peut.la source
Les méthodes d'interface statiques sont comme les méthodes de classe statiques (ici elles appartiennent uniquement à Interface). Où, par défaut, les méthodes d'interface fournissent
default implementation
des méthodes d'interface (quelles classes d'implémentation peuventoverride
)Mais rappelez-vous si une classe est une
implementing more than one interface with same default
signature de méthode, alors la classe d'implémentationneeds to override the default method
Vous pouvez trouver un exemple simple ci-dessous (peut bricoler pour différents cas)
Cela dépend de votre énoncé de problème. Je dirais que les méthodes par défaut sont utiles, si vous avez besoin de la même implémentation pour une méthode de votre spécification dans toutes les classes de ce contrat, ou si elles peuvent être utilisées comme des
Adapter
classes.voici une bonne lecture: /software/233053/why-were-default-and-static-methods-added-to-interfaces-in-java-8-when-we-alread
également ci-dessous oracle doc explique les méthodes par défaut et statiques pour faire évoluer les interfaces existantes:
http://docs.oracle.com/javase/tutorial/java/IandI/nogrow.html
la source
Voici mon avis:
méthode statique dans l'interface:
Vous pouvez l'appeler directement (InterfacetA.staticMethod ())
La sous-classe ne pourra pas passer outre.
La sous-classe peut avoir une méthode avec le même nom que staticMethod
méthode par défaut dans l'interface:
Vous ne pouvez pas l'appeler directement.
La sous-classe pourra la remplacer
Avantage:
Méthode statique: vous n'avez pas besoin de créer une classe distincte pour la méthode utilitaire.
Méthode par défaut: fournit la fonctionnalité commune dans la méthode par défaut.
la source
Ce lien contient des informations utiles, vous en avez répertorié quelques-unes ici.
les méthodes par défaut et statiques ont comblé les différences entre les interfaces et les classes abstraites .
Méthodes par défaut de l' interface :
Méthodes statiques d' interface :
Je voudrais citer une autre référence utile .
la source
Méthodes par défaut de l'interface:
Cela permet d'éviter les classes utilitaires, telles que toutes les méthodes de classe Collections peuvent être fournies dans les interfaces elles-mêmes.
Cela aide à étendre les interfaces sans avoir peur de casser les classes d'implémentation.
Méthodes statiques d'interface:
Ils font partie de l'interface, nous ne pouvons pas l'utiliser pour les objets de classe d'implémentation.
Cela aide à assurer la sécurité en ne permettant pas aux classes d'implémentation de les remplacer.
Maintenant, comment une méthode statique assurant la sécurité. Voyons un exemple.
Ici
obj.newMethod();
impression de la logique d'implémentation de classe signifie que nous pouvons changer la logique de cette méthode à l'intérieur de la classe d'implémentation.Mais la
obj.anotherNewMethod();
logique d'implémentation de classe d'impression, mais pas d'implémentation d'interface modifiée. Donc, si une logique de cryptage-décryptage écrite à l'intérieur de cette méthode, vous ne pouvez pas changer.la source
Selon Javadocs d'Oracle: http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html
Normalement, la méthode statique dans l'interface est utilisée comme méthodes d'assistance tandis que la méthode par défaut est utilisée comme implémentation par défaut pour les classes qui implémentent cette interface.
Exemple:
la source
Conformément à la documentation JLS Java14 :
Méthode par défaut:
C'est une méthode d'instance déclarée dans une interface avec le modificateur par défaut
Il n'est accessible que par l'instance de la classe d'implémentation
Son corps est toujours représenté par un bloc, qui fournit une implémentation ou un comportement par défaut pour toute classe d'implémentation sans remplacer la méthode
Cela ne peut jamais être statique ou privé
Méthode statique:
Il peut être appelé par l'interface sans référence à un objet particulier, tout comme les méthodes statiques de classe
La méthode statique peut être privée
La classe d'implémentation ne peut pas accéder à la méthode statique
Comprenons-le à l'aide de l'exemple de code ci-dessous:
la source
nous ne pouvons pas exécuter
Interfacesample2.menthod3();
car ce n'est pas une méthode statique. Pour exécuter,method3()
nous avons besoin d'une instance deInterfacesample2
interface.Veuillez trouver l'exemple pratique suivant:
la source
L'interface de démarrage de Java 8 peut également avoir une méthode statique. Comme la méthode statique d'une classe, la méthode statique d'une interface peut être appelée à l'aide du nom d'interface.
Exemple
La différence entre la méthode statique et la méthode d'interface par défaut est que la méthode par défaut prend en charge l'héritage, mais pas la méthode statique. La méthode par défaut peut être remplacée dans l'interface d'héritage.
Voici une bonne lecture de la méthode par défaut de l'interface et de la méthode statique. Méthode d'interface par défaut dans Java 8
la source
Toutes les bonnes réponses ici. Je voudrais ajouter une autre utilisation pratique de la fonction statique dans l'interface. L'astuce vient du livre - Effective Java, 3e édition de Joshua Bloch dans le chapitre 2: Créer et détruire un objet.
Les méthodes de fabrique statique sont des méthodes qui retournent un objet. Ils fonctionnent comme constructeur. Dans des cas spécifiques, la méthode de fabrique statique fournit un code plus lisible que l'utilisation du constructeur.
Citation du livre - Effective Java, 3e édition par Joshua Bloch
L'auteur donne un exemple de collections où une telle méthode de fabrique statique est implémentée. En vérifiant le code, Josh Bloch peut être considéré comme le premier auteur de la classe Collections. Bien que Collections soit une classe et non une interface. Mais le concept s'applique toujours.
En outre, il explique que l'API n'est pas seulement plus petite, elle contribue à la lisibilité du code et à la facilité de l'API.
Voici l'une des méthodes statiques de la classe java.util.Collections:
la source