Java, extends, implements, interface ?

xdoomer

Habitué
Slt a tous,
Voila je suis en train d'apprendre le Java et il y a deux ou trois chose que j' n'ai pas bien compris (et oui je suis issu du C# :) ), et je n'ai pas trouver de réponse claire et précise sur le net.

Voila mes question :

1 - Quelle est la différence entre extends et implements ?
2 - A quoi sert une interface ?

Merci ;)
 

KangOl

Grand Maître
et tu apprends java comment ?
parce qu'un livre qui explique pas ca, il est juste bon a caller une table et encore ...
 

xdoomer

Habitué
Ouais, j'ai plusieurs tuto en pdf, mais les explication fournie sont loin d'être claire, et le prof qui nous fait le cours et loin d'être claire aussi ;)
 

oliBE

Expert
Salut,
Les interfaces existent pourtant aussi en C#. C'est un des concepts importants, je trouve, qui fait la puissance d'un language orienté objet.

Tout d'abord, tu dois savoir qu'une classe ne peut hériter que d'une seule autre classe. Il n'y a pas d'héritage multiple en Java.
'extends' est le mot clé qui stipule à Java la classe à partir de laquelle tu hérites/dérives.
ex : <modificateurs d'accès> <autres modificateurs optionnels> class <nom de la classe> extends <nom de la super classe> <corps de la classe>

La dérivation d'une classe
. peut avoir comme but la spécialisation; la classe dérivée définit de nouveaux comportements et devient ainsi une version spécialisée de sa super classe; c'est le cas le plus fréquent;
. peut consister uniquement en une modification de l'implémentation d'une méthode pour la rendre plus efficace par exemple;
. peut consister à fournir des implémentations à des méthodes qui n'en avaient pas, comme c'est le cas avec les classes abstraites.

Héritage et contrat
Quand on dérive une classe, on crée une nouvelle classe avec un nouveau contrat qui est une extension du contrat de la super classe (comme en dotnet). La partie héritée du contrat n'est pas modifiée. On peut changer la façon dont la super classe implémente son contrat mais jamais dans un sens qui le violerait.
L'héritage a comme conséquence qu'une classe présente en fait deux contrats:
un pour les utilisateurs de la classe
un autre pour ceux qui souhaitent dériver la classe.

Les différentes formes d'héritage
Il existe deux formes d'héritage:
. un héritage de contrat (ou de type), dans lequel la classe dérivée acquiert le type de sa super classe et peut donc être utilisée partout où cette dernière peut l'être (c'est le polymorphisme, génial :))
. un héritage d'implémentation dans lequel la classe dérivée acquiert l'implémentation de sa super classe c'est-à-dire qu'elle hérite des champs et méthodes qui lui sont accessibles.
Lorsqu'on dérive une classe, la classe dérivée hérite à la fois du contrat (du type) et de l'implémentation.
Cependant en utilisant les interfaces, on peut créer des nouveaux types indépendamment de toute implémentation.
On peut également réutiliser des implémentations existantes sans hériter du type en utilisant la composition et la délégation.


Pour les interfaces (implements) retient ceci :
Une classe définit un type ET son implémentation.
Une interface (au sens de Java) définit un type SANS implémentation.

Une interface (au sens de java) ne peut contenir que
1. des en-têtes de méthodes d'instance qui implicitement sont public et abstract, et ne peuvent avoir d'autres modificateurs; par convention, ces modificateurs sont omis, mais tu peux les indiquer pour t'y retrouver au début.
2. des déclarations de constantes qui, par défaut, sont public, final et static et ne peuvent avoir d'autres modificateurs; par convention, ces modificateurs sont omis, mais tu peux les indiquer pour t'y retrouver au début.
3. des interfaces et des classes imbriquées

Une interface ne peut donc être instanciée puisqu'elle ne comporte aucune implémentation.

Une classe peut implémenter une ou plusieurs interfaces et donc, par ce fait, étendre son propre type. Le langage Java permet donc l'héritage multiple d'interfaces. Les concepteurs de Java ont retenu de l'héritage multiple ce qu'ils considéraient comme le plus utile et posait le moins de problème.
En effet, l'expérience a montré que ce qui pose problème dans l'héritage multiple, c'est l'héritage d'implémentations
et non pas l'héritage d'interfaces.

Une interface peut avoir plusieurs implémentations différentes (contrairement à une classe).


largement inspiré de :
The Java Programming Language 4th edition
K.Arnold – J.Gosling – D.Holmes


Pour terminer et troller un peu : tu as bien fais de te mettre à Java. Peut-être comme moi tu le préféreras à l'architecture dotnet. C# ou autre ;)
 

xdoomer

Habitué
Je te remercie de ta réponse qui est très compléte, je précise qu'en C# on utilisait pas les interfaces ni les design pattern, c'est pour cela qu'en passant en java cetaines chose m'échappes un peu. Je me suis mis au java a cause de ma formation, mais en tous cas chaque langage possède ses avantages et ses inconvénient, je préfére le C# sur certain point et le java pour d'autre point ;)
 

xdoomer

Habitué
Au niveau de l'extends (de l'héritage), je n'ai aucun problème.
j'ai bien lu ton explication, mais je vois pas trop ou on veut en venir avec implements et la notion d'interface ?
et tu entens quoi quand tu parles d'une "implémentation" ?
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 059
Membres
1 586 394
Dernier membre
Manoushk
Partager cette page
Haut