IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

polymorphisme en java


Sujet :

avec Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Points : 62
    Points
    62
    Par défaut polymorphisme en java
    bonjour, j'essaye de comprendre le polymorphisme en java et je suis tombé sur un programme qui compile et s'exécute et affiche un résultat , cependant je ne comprend pas le résultat afficher...
    Pouvez vous m'expliquer le résultat afficher?

    Merci de votre compréhension
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    class canard
    {
      int pieds = 2;
      int jambes(){ return pieds;}
    }
     
    class unicanard extends canard
    {
      int pieds = 1;
      int jambes(){ return pieds;}
      static public void main(String argv[])
      {
    	canard c = new canard();
    	System.out.println(c.pieds);
    	System.out.println(c.jambes());
    	c = new unicanard();
    	System.out.println(c.pieds);
    	System.out.println(c.jambes());
      }
    }

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 565
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    Afficher la valeur de c.pieds n'est pas un exemple de polymorphisme, pas en Java en tout cas.
    En Java le polymorphisme ne concerne que les méthodes des objets. Ça ne concerne pas les variables membres, ni les classes internes, ni rien d'autre.

    - Bref, concernant le polymorphisme :
    -- le premier c.jambes() renvoie 2, parce que c est une instance de la classe Canard, et que la méthode jambes() de la classe Canard renvoie toujours 2.
    (Ceci parce qu'elle renvoie la valeur de la variable membre pieds, qui est initialisée à 2 et ne change jamais.)

    -- le second c.jambes() renvoie 1, parce que c est une instance de la classe UniCanard, et que la méthode jambes() de la classe UniCanard, redéfinissant celle de Canard, renvoie toujours 1.
    (Pareil, parce qu'elle renvoie la valeur de la variable membre pieds, qui est initialisée à 1 et ne change jamais.)

    - Concernant c.pieds, là le polymorphisme n'intervient pas. Parce que pieds n'est pas une méthode.
    Comme le polymorphisme n'intervient pas, ce qui compte dans c.pieds est le type déclaré de c, pas la classe réelle dont c est une instance.
    Le type déclaré de c est Canard. Donc c'est toujours la variable membre de la classe Canard, qui est lue. Cette variable est initialisée à 2 et ne change pas. Donc elle vaut toujours 2.
    De manière générale, écrire ce genre de code est une mauvaise idée. Les classes filles ne devraient pas déclarer de variable membre qui portent le même nom qu'une de la classe mère. Parce qu'on arrive à des trucs comme l'exemple donné, et qu'on comprend pas trop ce qui se passe.

  3. #3
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Le polymorphisme est la, car jambes() te retourne la valeur de la classe dynamique.
    En revanche, faut grave se méfier quand tu redéfinis un membre dans une sous-classe car si tu mates dans la JVM tu verras qu'il y a 2 membres de créés.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 565
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    Citation Envoyé par Djakisback Voir le message
    En revanche, faut grave se méfier quand tu redéfinis un membre dans une sous-classe car si tu mates dans la JVM tu verras qu'il y a 2 membres de créés.
    D'ailleurs ça ne s'appelle pas redéfinir (on ne peut redéfinir qu'une méthode, la redéfinition étant le principe même du polymorphisme.)

    Cela s'appelle masquer. Déclarer une nouvelle variable membre, de même nom qu'une variable membre de la classe mère, masque celle qui existait déjà avant. Dans la classe fille il y a désormais deux variables de même nom, mais ce nom désigne en priorité celle définie dans la classe fille.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Points : 62
    Points
    62
    Par défaut
    merci beaucoup pour ton explication thelvin concernant ce problème, je comprend mieux le résultat...

  6. #6
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Citation Envoyé par thelvin Voir le message
    D'ailleurs ça ne s'appelle pas redéfinir (on ne peut redéfinir qu'une méthode, la redéfinition étant le principe même du polymorphisme.)

    Cela s'appelle masquer. Déclarer une nouvelle variable membre, de même nom qu'une variable membre de la classe mère, masque celle qui existait déjà avant. Dans la classe fille il y a désormais deux variables de même nom, mais ce nom désigne en priorité celle définie dans la classe fille.
    Merci pour cette précision que je ne connaissais pas

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2003
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    J'ai des messages d'erreurs à l'exécution de ce programme..

    Edit : manque public class "Identifiant"{

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. JAVA EE et polymorphisme d'inclusion?
    Par backlash dans le forum Java EE
    Réponses: 1
    Dernier message: 02/11/2012, 14h00
  2. Le polymorphisme en Java
    Par anaaa dans le forum Langage
    Réponses: 14
    Dernier message: 03/02/2012, 15h35
  3. Réponses: 7
    Dernier message: 18/06/2008, 19h01
  4. Polymorphisme en java ?
    Par cannavaro2006 dans le forum Langage
    Réponses: 3
    Dernier message: 31/01/2007, 13h17
  5. débutant java Polymorphisme
    Par Bba_M dans le forum Langage
    Réponses: 8
    Dernier message: 12/06/2006, 09h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo