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

Langage Java Discussion :

Héritage de méthodes


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    919
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 919
    Par défaut Héritage de méthodes
    Bonjour,

    Voici un petit exemple de ce qui me pose problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class A {
       public void M1() { M2(); }
       public void M2() { }
    }
     
    class B extends A {
       public void M1() { super.M1(); }
       public void M2() { super.M2(); }
    }
     
    B b=new B();
    b.M1();
    A partir de là je ne comprends pas ce qui se passe.
    En trace je vois que la séquence d'appel est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    B-M1() -> A-M1() -> A-M2()
    Je me serais attendu à avoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    B-M1() -> A-M1() -> B-M2() -> A-M2()
    Quelqu'un peut me dire pourquoi est-ce que la méthode M2() de la classe B n'est pas appellée et comment faire pour qu'elle le soit ?

    Merci,

    Laurent

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Es-tu sûr de tes traces ? Parce que j'obtiens bien le second résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    B.M1()
    A.M1()
    B.M2()
    A.M2()
    a++

  3. #3
    Invité
    Invité(e)
    Par défaut
    Je peux me tromper mais, avec le code fournit, je m'attendrais plutôt au résultat 1.

    En effet quand B.M1 est appelée, elle appelle super.M1, donc A.M1.

    A son tour A.M1 fait un appel à M2, qui n'est autre que A.M2.

    Donc j'obtiens bien la trace B.M1 -> A.M1 -> A.M2.

    Pour avoir B.M1 -> A.M1 -> B.M2 -> A.M2 il faudrait que A.M1 connaisse sa propre sous-classe, B. Ce qui est impossible.

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kei2906 Voir le message
    A son tour A.M1 fait un appel à M2, qui n'est autre que A.M2.
    Non puisque l'appel de méthode est virtuelle et est déterminé à l'exécution. Comme la méthode est redéfinie dans la classe fille et c'est donc la redéfinition de méthode qui est appelée.


    Citation Envoyé par kei2906 Voir le message
    Pour avoir B.M1 -> A.M1 -> B.M2 -> A.M2 il faudrait que A.M1 connaisse sa propre sous-classe, B. Ce qui est impossible.
    C'est possible puisque la méthode à appeler est déterminée à l'exécution...

    Pour vérifier il te suffit d'exécuter ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class A {
    	public void M1() { System.out.println("A.M1()"); M2(); }
    	public void M2() { System.out.println("A.M2()"); }
    }
     
    class B extends A {
    	public void M1() { System.out.println("B.M1()"); super.M1(); }
    	public void M2() { System.out.println("B.M2()"); super.M2(); }
     
    	public static void main(String[] args) {
    		new B().M1();
    	}
    }
    a++

  5. #5
    Invité
    Invité(e)
    Par défaut
    Exact, excuse-moi.

    Je m'étais un peu embrouillé. Conceptuellement parlant je trouve ça qu'à moitié logique mais bon... La JVM a toujours le dernier mot

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kei2906 Voir le message
    Conceptuellement parlant je trouve ça qu'à moitié logique mais bon...
    Pourtant c'est toute la force de l'héritage !

    a++

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

Discussions similaires

  1. Héritage et méthodes
    Par lamoua76 dans le forum Langage
    Réponses: 7
    Dernier message: 07/12/2007, 18h27
  2. héritage et méthode abstraite
    Par troussepoil dans le forum C++
    Réponses: 13
    Dernier message: 30/03/2007, 09h51
  3. Exceptions, héritage et méthodes virtuelles
    Par Nuwanda dans le forum C++
    Réponses: 13
    Dernier message: 23/05/2006, 12h06
  4. Réponses: 8
    Dernier message: 04/06/2004, 09h13
  5. [Héritage] Redéfinition méthode
    Par petit-ourson dans le forum Langage
    Réponses: 9
    Dernier message: 06/05/2004, 16h06

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