web-dev-qa-db-fra.com

Java 9 Interface vs classe

Comme Java 9 va nous permettre de définir private et private static méthodes aussi dans les interfaces, quelle serait la différence restante entre interface et class? De plus, Java évolue-t-il lentement vers l'héritage multiple?

40
Aakash

Les méthodes d'interface privée dans Java 9 se comportent exactement comme les autres méthodes privées: elles doivent avoir un corps (même dans les classes abstraites) et ne peuvent être ni appelées ni remplacées par des sous-classes. En tant que telles, elles n'interagissent pas vraiment en parlant d’héritage (et en particulier d’héritage multiple), il en existe (au moins?) trois sortes:

  • Héritage de types signifie qu'un type peut être un autre type, par ex. String est un Object. Java a permis l'héritage multiple de types dès le premier jour (via des interfaces).
  • Héritage du comportement signifie qu'un type peut hériter du comportement d'un autre type. Avant Java 8, seules les classes pouvaient implémenter des méthodes, il n'y avait donc qu'un seul héritage de ce type. Avec Java 8, les méthodes par défaut permettaient aux interfaces de mettre en œuvre , donnant ainsi Java héritage multiple de comportement.
  • Héritage d'état signifie qu'un type hérite de l'état interne d'un autre type (c'est-à-dire des champs). En l'état (Java 9 et tout ce qui est actuellement proposé pour les futures Java), seules les classes peuvent avoir un état, il n'y a donc qu'un seul héritage de ce type.

Comme vous pouvez le voir, les méthodes d'interface privée n'ajoutent rien ici.

Concernant votre question sur la façon dont les interfaces et les classes se comparent, il existe deux différences principales: l'héritage multiple et l'état. Les interfaces prennent en charge la première, les classes peuvent avoir la seconde. Puisque l'état est assez important dans la POO typique, les classes resteront pertinentes. ????

S'il y avait un moyen pour une interface de forcer une implémentation à avoir un champ non public particulier ou à en définir un lui-même, le jeu changerait et les interfaces pourraient rivaliser avec les classes.

43
Nicolai

Les méthodes privées ne sont pas héritées par les sous-classes, donc cette fonctionnalité n'affecte pas les classes d'implémentation. Je crois que les méthodes privées dans les interfaces nous permettent de partager du code entre les méthodes par défaut.

Les interfaces Java ne peuvent toujours pas avoir de membres non statiques. C'est une grande différence et non pas un IMO à héritage multiple.

28
xiaofeng.li

Les interfaces Java 9 ne peuvent toujours pas contenir de champs et de constructeurs. Cela fait une énorme différence entre les classes et les interfaces, donc Java 9 est loin d'être l'héritage multiple.

20
ZhekaKozlov

L'interface Java dans la version 9 a des méthodes privées mais statiques privées. La fonctionnalité a été introduite pour permettre des méthodes modulaires. Une fonction devrait fonctionner avec une seule responsabilité au lieu d'utiliser de longues méthodes par défaut. Cela n'a rien à voir avec l'héritage multiple. Plus les méthodes statiques sont privées, plus vous pourrez écrire du code propre et réutilisable. Quoi qu'il en soit, les méthodes statiques, qu'elles soient publiques ou protégées, ne peuvent pas être remplacées.

2
hi.nitish