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 et sous classe


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 264
    Par défaut Héritage et sous classe
    Bonjour, je suis en train d'essayer de comprendre le systéme d'héritage. Cependant je bloque sur un cas particulier:

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    public class Test1 {
    	public static void main(String[] args) {
    		C c = new D();
     
    		c.f();
    	}
    }
    class C{
     
    	private int i = 0 ;
    	public C(){
    		i = 1 ; 
    		f();
    	}
    	public void f(){
     
    		System.out.print("i = " + i);
    	}
    }
     
    class D extends C{	
    	private int j = 0 ; 
    	public D(){
     
    		j = 1 ;
    	}
     
    	public void f(){
     
    		super.f();
    		System.out.println(" - j = "+ j );
    	}
     
    }

    J'ai ceci comme code d'exécution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    i = 1 - j = 0
    i = 1 - j = 1
    Le probléme est que je my perds dans la l'exécution. Je ne sais pas qui est exécuter avant quoi !!

    Je sais que la création d'un objet de type dérivé pour cette example :
    1) Allocation mémoire oiur un objet de type B.
    2) Initialisation par d"faut de tous les champs de B
    3) Initialisation explicite, s'l y a lieu des champs hrités de A
    4) Exécution du corps du constructeur de A
    5) initialisation explicite des champs propre à B
    6) Exécution du corps du constructeur de B.

    Mais apparament sa ne colle pas avec mon cas , car j'instancie un objet de la classe mére avec un constructeur de la classe dérivé !
    Est-ce qqun aurrait une idée ?

  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,


    En gros les constructeurs de la classe parente sont exécuté en premier.
    Chaque constructeur commence toujours par un appel au constructeur parent (implicitement ou explicitement avec super()).

    Lorsque tu crées une nouvelle instance d'une classe :
    • Tous les champs défini dans toutes l'arborescence des classes sont initialisé avec les valeurs par défaut.
    • Puis pour chaque classe de l'arbre d'héritage, de la plus ancienne à la plus récente :
      • Le code des initialisations explicites est exécuté.
      • Le code du constructeur en lui même est exécuté.

      (puis on passe à la classe fille)





    Donc dans ton exemple lorsque tu fait new D(), c'est d'abord le constructeur de la classe parente C qui est appelé. Mais comme il appelle la méthode f() redéfinie dans D, tu en viens à utiliser j alors qu'il n'a pas été initialisé.

    En fait tu ne devrais jamais utiliser une méthode virtuelle dans un constructeur. Tu dois te limiter aux méthode static, private ou final (c'est à dire aux méthodes qui ne pourront pas être redéfinies)

    a++

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 264
    Par défaut
    OK d'accord merci beaucoup... on s'embrouille trés vite avec un truck comme sa !

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/11/2012, 12h16
  2. [2.x] Héritage - Changer la classe de mon objet par sa sous-classe
    Par sly_web2 dans le forum Symfony
    Réponses: 1
    Dernier message: 04/09/2012, 11h08
  3. Héritage dynamique de classes sous VB.NET
    Par hbfocus dans le forum Diagrammes de Classes
    Réponses: 2
    Dernier message: 21/07/2012, 12h02
  4. Héritage : clef primaire suivant la sous classe
    Par youkoun dans le forum Hibernate
    Réponses: 0
    Dernier message: 16/06/2010, 15h39
  5. Réponses: 7
    Dernier message: 24/09/2008, 11h18

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