Précédent   Forum des professionnels en informatique > Java > Général Java > Langage
Langage Forum d'entraide sur le langage Java et autres langages pour la JVM : syntaxe, POO, conventions, API standard. Avant de poster -> FAQ Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/10/2007, 15h43   #1
Invité régulier
 
Inscription : juin 2007
Messages : 65
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 65
Points : 5
Points : 5
Par défaut Le polymorphisme en Java

bonjour ,je suis débutante en java
j'essai depuis ce matin de comprendre le plymorphisme en java mais j'arrive pas ,j'ai lu plusieurs documents mais j'arrive pas !!
est ce que vous pouvez me l'expliquer d'une maniére beaucoup plus simple sans un code ??? merci
anaaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2007, 15h58   #2
Membre expérimenté
 
Inscription : juillet 2007
Messages : 694
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 694
Points : 506
Points : 506
Pour faire très simple, le polymophisme est une technique particulière d'héritage. Elle consiste, lorsqu'on hérite d'une classe, à redéfinir l'une des méthodes pour la spécialiser.
verbose est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 15/10/2007, 16h33   #3
in
Membre Expert
 
Avatar de in
 
Inscription : avril 2003
Messages : 1 609
Détails du profil
Informations personnelles :
Localisation : France, Finistère (Bretagne)

Informations forums :
Inscription : avril 2003
Messages : 1 609
Points : 1 564
Points : 1 564
le plus simple je pense et de chercher "polymorphisme java" dans un moteur de recherche. Tu auras de nombreuses définitions et exemples.

Je me lance dans une explication et j'espère ne pas t'induire en erreur, car ce n'est pas vraiment facile à expliquer ...

En gros, c'est un concept objet qui consiste à pouvoir utiliser la "même" méthode sur des objets différents.

exemple banal. Tu prends une classe et des sous classes.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Animal {
    void deplacer() {
        System.out.println("Je bouge");
    }
 
class Chien extends Animal {
    void deplacer() {
        System.out.println("Je marche");
    }
}
 
class Oiseau extends Animal {
    void deplacer(){
        System.out.println("Je vole");
    }
}
 
class Pigeon extends Oiseau {
    void deplacer() {
        System.out.println("Je vole et en plus ... sur les passants");
    }
}
Sur toutes ces classes, tu peux donc appeler deplacer(). Le polymorphisme permet alors d'appeler la bonne méthode selon le type d'objet

Code :
1
2
3
4
5
6
7
8
9
10
public static void main(String[] args) {
 
 Animal a1 = new Animal();
 Animal a2 = new Chien();
 Animal a3 = new Pigeon();
 
 a1.deplacer();
 a2.deplacer();
 a3.deplacer();
}
et à l'exécution ça te donne :
Citation:
Je bouge
Je marche
Je vole et en plus ... sur les passants
__________________
"If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/
in est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 15/10/2007, 17h25   #4
Membre éprouvé
 
Inscription : octobre 2007
Messages : 442
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 442
Points : 485
Points : 485
Juste un petit complément qui peut être intéressant...

Généralement on définit la classe mère comme étant abstraite et on oblige les objets réels à définir leur comportement :

Tu trouveras également de nombreux exemples sur les figures (triangle, carré, ...).

Genre :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
abstract class Figure
{
    private String couleur;
 
    class Figure (String couleur)
    {
        this.couleur = couleur;
    }
 
    public String getCouleur()
    {
        return couleur;
    }
 
    abstract int getSurface();
}
Et après tu fais Triangle extends Figure, Carre extends Figure, ...
Duc Lebowski est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 15/10/2007, 17h54   #5
Membre Expert
 
Inscription : octobre 2005
Messages : 1 403
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : octobre 2005
Messages : 1 403
Points : 1 600
Points : 1 600
Envoyer un message via MSN à iohack
Pour reprendre l'exemple de in, cela est particulièrement intéressant avec les conteneurs (Vector, List etc.).
Image que tu veuilles mettre des instances dedans, des chiens, des pigeons etc. et que tu veuilles qu'ils se déplaces tous.
Pour cela, il te suffit de créer un conteneur d'animal :
Code :
1
2
 
List<Animal> lst=new ArrayList<Animal>();
et d'appeler la méthode deplacer sur chaque élément:
Code :
1
2
3
4
 
for(int i=0;i<lst.size();i++){
   lst.get(i).deplacer(); // Appellera la méthode propre à chaque animal.
}
iohack est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 15/10/2007, 17h55   #6
Membre Expert
 
Inscription : octobre 2005
Messages : 1 403
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : octobre 2005
Messages : 1 403
Points : 1 600
Points : 1 600
Envoyer un message via MSN à iohack
Citation:
Envoyé par Duc Lebowski Voir le message
Juste un petit complément qui peut être intéressant...

Généralement on définit la classe mère comme étant abstraite et on oblige les objets réels à définir leur comportement :

Tu trouveras également de nombreux exemples sur les figures (triangle, carré, ...).

Genre :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
abstract class Figure
{
    private String couleur;

    public Figure (String couleur)
    {
        this.couleur = couleur;
    }

    public String getCouleur()
    {
        return couleur;
    }

    abstract int getSurface();
}
Et après tu fais Triangle extends Figure, Carre extends Figure, ...
Je te corrige une petite erreur.
iohack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2007, 18h37   #7
Membre éprouvé
 
Inscription : octobre 2007
Messages : 442
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 442
Points : 485
Points : 485
Merci iohack ! Affectivement !
Duc Lebowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 23h56   #8
Invité de passage
 
Homme oumar sendi
developpeur
Inscription : septembre 2011
Messages : 1
Détails du profil
Informations personnelles :
Nom : Homme oumar sendi
Localisation : Mauritanie

Informations professionnelles :
Activité : developpeur
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2011
Messages : 1
Points : 2
Points : 2
merci pou tous le monde ce géniale
oumar ould sendi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2011, 11h39   #9
Membre éclairé
 
Avatar de JoeChip
 
Inscription : septembre 2008
Messages : 293
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 293
Points : 346
Points : 346
Code :
1
2
3
4
5
 
List<Animal> lst=new ArrayList<Animal>();
for(int i=0;i<lst.size();i++){
   lst.get(i).deplacer(); // Appellera la méthode propre à chaque animal.
}
est bien mieux comme ça :

Code :
1
2
3
4
 
List<Animal> animaux = new ArrayList<Animal>();
for (Animal animal : animaux)
   animal.deplacer(); // Appellera la méthode propre à chaque animal.
Plus simple, plus performant. Aucun inconvénient. Et encore, il doit y avoir plus performant que ArrayList, selon ce que fait le reste de l'appli.

De même,

Code :
1
2
3
void deplacer() {
        System.out.println("Je bouge");
}
moi je ferais, dans Animal :

Code :
1
2
3
Animal deplacer() {
        return this;
}
puis, dans Pigeon :

Code :
1
2
3
Animal deplacer() {
        System.out.println("Je vole et en plus ... sur les passants "); return super.deplacer();
}
ce qui permet ensuite de faire des trucs genre

Code :
1
2
 
new Pigeon().deplacer().sePoser().grailler().roucouler().mourir();
Clair, performant, peu de boulot ensuite pour le GC, puisque tout passe par la pile.
JoeChip est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 16h10   #10
 
Homme Ahmed
Étudiant
Inscription : février 2012
Messages : 14
Détails du profil
Informations personnelles :
Nom : Homme Ahmed
Localisation : France, Allier (Auvergne)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2012
Messages : 14
Points : -1
Points : -1
Citation:
Envoyé par iohack Voir le message
Pour reprendre l'exemple de in, cela est particulièrement intéressant avec les conteneurs (Vector, List etc.).
Image que tu veuilles mettre des instances dedans, des chiens, des pigeons etc. et que tu veuilles qu'ils se déplaces tous.
Pour cela, il te suffit de créer un conteneur d'animal :
Code :
1
2
 
List<Animal> lst=new ArrayList<Animal>();
et d'appeler la méthode deplacer sur chaque élément:
Code :
1
2
3
4
 
for(int i=0;i<lst.size();i++){
   lst.get(i).deplacer(); // Appellera la méthode propre à chaque animal.
}
stp,dans ce cas là ça sera afficher que le message "je bouge " tant que le tableau est n'est pas vide???
zero.h est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 19h45   #11
Membre éprouvé
 
Homme Eric
Inscription : décembre 2010
Messages : 254
Détails du profil
Informations personnelles :
Nom : Homme Eric
Localisation : France

Informations forums :
Inscription : décembre 2010
Messages : 254
Points : 450
Points : 450
Et bien précisément, non...le message affiché pour chaque élément du tableau dépendra du type effectif de cet élément. Il faut juste comprendre qu'une variable a deux types en java:
1) le type de référence (c'est le type de la variable)
2) le type effectif: c'est le type de l'objet qui est dans cette variable à un instant donné.
Le type de référence te dit quelles méthodes seront visibles depuis cette variable (ex: toutes les méthodes publiques définies par Animal, + les méthodes protected si on utilise la variable depuis une classe dérivée d'Animal)
Le type effectif te dit quel sera le code effectivement utilisé quand tu appelles une méthode.
therwald est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/02/2012, 12h46   #12
Membre émérite
 
Avatar de professeur shadoko
 
Homme
réveur professionnel
Inscription : juillet 2006
Messages : 672
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 63
Localisation : Autre

Informations professionnelles :
Activité : réveur professionnel

Informations forums :
Inscription : juillet 2006
Messages : 672
Points : 853
Points : 853
tu as plein d'objets dans ton troupeau et tu leur dis "arrétez-vous tous!"
comme ils sont Closeable ("fermable") il vont gentiment obéir ... chacun à sa manière, ces opérations de fermeture peuvent prendre des formes différentes (polymorphisme) , ces objets sont différents (et pas nécessairement apparentés par héritage), tu ne sais pas dans le détail ce qu'ils font mais ils vont le faire!
ce genre de généralisation est très puissante car elle permet aussi de bien isoler les modifications de code: tu fais la paye et pour chaque salarié tu demande le taux horaire, chaque objet Salarié (du Lampiste au PDG) te donnes son taux horaire, si celui du PDG est modifié (au hasard ) seul le code de PDG est concerné pas celui de la paye!
__________________
J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
professeur shadoko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 12h50   #13
Membre éprouvé
 
Homme Eric
Inscription : décembre 2010
Messages : 254
Détails du profil
Informations personnelles :
Nom : Homme Eric
Localisation : France

Informations forums :
Inscription : décembre 2010
Messages : 254
Points : 450
Points : 450
Citation:
Envoyé par professeur shadoko Voir le message
tu fais la paye et pour chaque salarié tu demande le taux horaire, chaque objet Salarié (du Lampiste au PDG) te donnes son taux horaire, si celui du PDG est modifié (au hasard ) seul le code de PDG est concerné pas celui de la paye!
Sauf que là (à moins que le taux horaire des salariés de base soit une valeur fixe et celui du PDG calculé en fonction de son taux du jour de clearstream) tu n'as pas besoin de deux classes, donc ce n'est pas du polymorphisme...
therwald est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 15h11   #14
Membre émérite
 
Avatar de professeur shadoko
 
Homme
réveur professionnel
Inscription : juillet 2006
Messages : 672
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 63
Localisation : Autre

Informations professionnelles :
Activité : réveur professionnel

Informations forums :
Inscription : juillet 2006
Messages : 672
Points : 853
Points : 853
Citation:
Envoyé par therwald Voir le message
Sauf que là (à moins que le taux horaire des salariés de base soit une valeur fixe et celui du PDG calculé en fonction de son taux du jour de clearstream) tu n'as pas besoin de deux classes, donc ce n'est pas du polymorphisme...
ah bon
cela prouve que je n'ai pas rendu mon exemple assez clair:
un Salarie à une méthode getTauxHoraire
les classes Lampiste, Grouillot, ContreMaitre, PetitChef, GrandChef, PDG ont chacune une méthode particulière (mais conforme au contrat "gatTauxHoraire" pour calculer le taux horaire en fonction de leur champs indice et de circonstances propres à leur métier.

Ces codes sont mis et modifiés dans les classes correspondantes.
La Paye de ne pose pas de question et elle demande à chaque instance conforme au "contrat" Salarie de lui donner son taux horaire ....

C'est plus clair?
__________________
J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
professeur shadoko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 15h35   #15
Membre éprouvé
 
Homme Eric
Inscription : décembre 2010
Messages : 254
Détails du profil
Informations personnelles :
Nom : Homme Eric
Localisation : France

Informations forums :
Inscription : décembre 2010
Messages : 254
Points : 450
Points : 450
Effectivement là on voit mieux la variation dans l'algorithme, donc à mon sens c'est plus clair.
therwald est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h28.


 
 
 
 
Partenaires

Hébergement Web