43 votes

Java 9 Interface vs Classe

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

31 votes

Je suis surpris que cela ait autant de votes positifs... Différences restantes : protected soutien, package-private soutien, En gros, tout sauf l'ajout de private y static .. Les interfaces ne peuvent pas étendre les classes, les mots-clés réservés interface y class , la philosophie/le but/la raison d'être des deux. Je pourrais probablement continuer

3 votes

La réponse est toujours la même que dans Interface avec méthodes par défaut vs classe abstraite en Java 8 sauf qu'il peut y avoir private dans une interface, qui ne peut évidemment pas avoir d'impact sur les autres classes.

5 votes

@Aakash Étudiant : " Y a-t-il des questions stupides ? " Professeur : " Bien sûr que non ! "Et si l'élève posait à nouveau cette question juste après avoir obtenu la réponse ? Ne serait-ce pas une question stupide ? L'idée derrière cette phrase est " n'ayez pas peur de poser des questions, c'est ainsi que vous obtiendrez des réponses ", n'en abusez pas pour encourager la paresse.

46voto

Nicolai Points 17516

Les méthodes d'interface privées de 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 surchargées par les sous-classes. En tant que telles, elles n'ont pas vraiment d'interaction avec l'héritage. En parlant d'héritage (et en particulier d'héritage multiple), il en existe (au moins ?) trois types :

  • Héritage des types signifie qu'un type peut être un autre type, par exemple String est un Object . Java a permis l'héritage multiple des types dès le premier jour (via les 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 sont apparues les méthodes par défaut, qui ont permis aux interfaces de mettre en œuvre des méthodes, donnant ainsi à Java un héritage multiple du comportement.
  • Héritage de l'état signifie qu'un type hérite de l'état interne d'un autre type (c'est-à-dire des champs). Dans l'état actuel des choses (Java 9 et tout ce qui est actuellement proposé pour les futures versions de 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 constater, les méthodes de l'interface privée n'ajoutent rien ici.

En ce qui concerne votre question sur la comparaison entre les interfaces et les classes, il existe deux différences principales : l'héritage multiple et l'état. Les interfaces supportent 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 existait un moyen pour une interface de forcer une implémentation à avoir un champ non public particulier ou à en définir un elle-même, le jeu changerait et les interfaces pourraient concurrencer les classes.

0 votes

Ce n'est pas joli et je ne veux pas le voir en production, mais l'état ne pourrait-il pas être encapsulé dans une classe interne pour simuler l'héritage de classes multiples ? Similaire à ceci : stackoverflow.com/questions/3427073/

0 votes

Puisque la classe interne ainsi que le champ qui y fait référence seraient publics, cela ne compte pas vraiment comme l'héritage d'un état privé ;) L'état public n'est pas un problème, il suffit de placer les méthodes relatives à l'état dans l'interface.

29voto

infgeoax Points 1041

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 pense que les méthodes privées dans les interfaces nous permettent de partager le 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 de l'héritage multiple IMO.

20voto

orionll Points 1045

Les interfaces de 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 de l'héritage multiple.

2voto

Umar Tahir Points 453

Bien qu'il s'agisse d'une vieille question, permettez-moi d'y apporter ma contribution :)

  1. classe abstraite : Dans la classe abstraite, nous pouvons déclarer une instance qui sont nécessaires à la classe enfant

    Interface : Dans une interface, toutes les variables sont toujours publiques et statiques et final, nous ne pouvons pas déclarer de variables d'instance

  2. classe abstraite : Une classe abstraite peut parler de l'état d'un objet

    Interface : L'interface ne peut jamais parler de l'état de l'objet

  3. classe abstraite : Dans une classe abstraite, nous pouvons déclarer des constructeurs

    Interface : A l'intérieur de l'interface, nous ne pouvons pas déclarer de constructeurs car le but de
    Les constructeurs servent à initialiser les variables d'instance. Ainsi, quel construire si nous ne pouvons pas avoir de variables d'instance dans les dans les interfaces .

  4. classe abstraite : A l'intérieur de la classe abstraite, nous pouvons déclarer des blocs d'instance et statiques.

    Interface : Les interfaces ne peuvent pas avoir de blocs d'instance et de blocs statiques.

  5. classe abstraite : Une classe abstraite ne peut pas faire référence à une expression lambda

    Interfaces : Les interfaces avec une seule méthode abstraite peuvent faire référence à une expression lambda.

  6. classe abstraite : A l'intérieur d'une classe abstraite, nous pouvons surcharger les méthodes de la classe OBJET.

    Interfaces : On ne peut pas surcharger les méthodes OBJECT CLASS dans les interfaces.

Je terminerai sur la note que :

Concepts de méthode par défaut/concepts de méthode statique dans l'interface est venu juste pour sauver les classes d'implémentation mais pas pour fournir une implémentation utile et significative. Les méthodes par défaut et les méthodes statiques sont une sorte d'implémentation factice, "si vous voulez vous pouvez les utiliser ou vous pouvez les surcharger (dans le cas des méthodes par défaut) dans la classe d'implémentation". Cela nous évite de mettre en œuvre de nouvelles méthodes dans les classes d'implémentation chaque fois que de nouvelles méthodes sont ajoutées dans les interfaces. Par conséquent, les interfaces ne peuvent jamais être égales aux classes abstraites.

2voto

hi.nitish Points 1124

L'interface Java dans la version 9 a des méthodes privées mais static private. Cette fonctionnalité a été introduite pour permettre des méthodes modulaires. Une fonction doit 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 il y a de méthodes statiques privées, plus vous serez en mesure d'écrire un code propre et réutilisable. De toute façon, les méthodes statiques, qu'elles soient publiques ou protégées, ne peuvent pas être surchargées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X