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

Java Discussion :

Problème de coherence entre 'override de fonction et de variable


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2014
    Messages : 18
    Points : 20
    Points
    20
    Par défaut Problème de coherence entre 'override de fonction et de variable
    Bonjour,

    Je potasse un bouquin sur Java 8, et un truc me semble étrange : quand je créé une classe et une classe fille, les 2 comportant une même variable et une même méthode ... :


    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
     
    public class A{
        public int nombre= 4;
        public String getNom(){   return "A";   }    
    }
     
     
    public class B extends A{
        public int nombre= 8;
        public String getNom(){   return "B";   }
     
        public static void main(String[] args){
            A obj= new B();
            System.out.println("Nom : " + obj.getNom() + ", num : " + obj.nombre);
        }
    }
    => Nom : B, num : 4

    ... la méthode utilisée est celle de la classe fille, mais la variable utilisée est celle de la classe mère !!
    Pas très cohérent tout cela non ?

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    c'est pourtant le concept du polymorphisme.
    Je comprends que ce soit surprenant quand on débute, mais seulement à ce moment-là.

    Les méthodes décrivent un comportement et le polymorphisme est l'idée que ce comportement dépende de l'implémentation qu'on a choisi de lui donner dans les classes filles en redéfinissant les méthodes.
    Les variables ne sont pas un comportement, c'est complètement autre chose, donc ça ne fait pas ça.


    Concrètement, ce qui se passe, c'est que quand tu fais référence à la variable nombre, tu le fais sur une référence de type A. Donc c'est la variable A.nombre sur cet objet. Pas de polymorphisme, pas de question. La référence est de type A donc la variable est celle du type A.

    Quand tu appelles la méthode getNom(), c'est évidemment la méthode déclarée par le type A, puisque la référence est de type A. Mais, c'est une méthode, un comportement, donc il se pose la question du polymorphisme. Et maintenant que cette question se pose, eh bien il se trouve que dans cette référence de type A, à l'exécution on constate que c'est un objet de classe B qui s'y trouve, et la classe B a redéfini la méthode getNom(). Redéfinition => donc c'est celle-ci qui s'applique, B.getNom().


    Concrètement comment on fait pour ne pas se faire des nœuds au cerveau avec ça.
    Eh ben, on ne référence jamais les variables d'un objet, et comme ça, la question ne se pose pas. Là tu as fait référence à obj.nombre. Si tu ne fais pas ça, et que tu appelles plutôt une méthode obj.getNombre(), il n'y a plus de problème.
    C'est comme ça qu'on fait dans le monde réel. Les variables membres d'une classe ne sont le problème que de cette classe et éventuellement peut-être des sous-classes. Le reste du monde ne devrait pas s'en mêler. Ça veut dire en gros que bien qu'on puisse en faire, les variables public mais pas static ont surtout tendance à embrouiller.
    À la rigueur si on est de la vieille école on peut faire des variables public pas static pour économiser les parenthèses d'un appel de méthode, mais on le fera sur des classes final, qui ne peuvent pas avoir de sous-classe et donc pour lesquelles le problème n'existe pas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2014
    Messages : 18
    Points : 20
    Points
    20
    Par défaut
    C'est clair, merci thelvin !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/09/2011, 08h42
  2. Réponses: 5
    Dernier message: 27/08/2009, 22h18
  3. Problème d'incompatibilité entre 2 fonction
    Par bog333 dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 03/10/2008, 19h47
  4. Réponses: 2
    Dernier message: 25/10/2007, 13h56
  5. Réponses: 19
    Dernier message: 28/10/2005, 17h29

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