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 :

Variable / Héritage / Ovveride


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 23
    Par défaut Variable / Héritage / Ovveride
    Voila j'ai une classe définit comme suit :

    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 abstract class AJPanel_Scrollable extends JScrollPane {
     
    	protected IHM mIHM = null;
     
    	public AJPanel_Scrollable(IHM pIHM) {
    		super();
    		mIHM = pIHM;
    		init();
    	}
     
    	private void init() {
    		this.setViewportView(getContent());
    	}
     
    	protected abstract JPanel getContent();
    }
    Ainsi qu'une autre qui en hérite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class JPanel_InfosSP extends AJPanel_Scrollable
    qui définit 2 variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private Boolean mIsOwner = new Boolean(true);
    private boolean mIsAdmin = true;
    surcharge la méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Override
    	protected JPanel getContent() {
    		if (mContent == null) {
    			mContent = new JPanel();
    			init();
    			initComponents();
    			setData();
    		}
    		return mContent;
    	}
    et le problème arrive ici, dans initComponents j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    System.out.println(mIsOwner);
    System.out.println(mIsAdmin);
    et j'ai cette trace

    >>> null
    >>> false

    WHY???

  2. #2
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Bonsoir, c'est normal. Le constructeur de JPanel_InfosSP appelle un des constructeurs de AJPanel_Scrollable. A ce stade, la méthode init() est appelée, et celle-ci appelle la méthode getContent() définie dans AJPanel_Scrollable. Cette méthode appelle la méthode initComponents(), et accède aux variables mIsOwner et mIsAdmin mais le code d'initialisation de ces variables n'a pas encore été exécuté, donc les valeurs affichées sont conformes.
    Dans ton cas, le plus simple est de déplacer l'initialisation de ces variables dans la méthode JPanel_InfosSP.init() mais, d'une manière générale, la règle à suivre est de ne pas appeler de méthodes public, package private ou protected de la classe depuis le constructeur, car tu n'es pas certain qu'elles ne vont pas accéder à des variables non encore initialisées.

    Il serait préférable de procéder en deux temps :
    1. construire ton objet en appelant le constructeur adéquat
    2. appeler la méthode init() sur l'objet ainsi construit

    Ainsi, tu es certain que l'objet est entièrement construit (et donc que les variables d'instance sont correctement initialisées) avant d'appeler des méthodes publiques dessus.

    Un autre exemple avec ce code d'un comportement inattendu :
    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
    abstract class A {
     
      A() {
        m();
      }
      abstract void m();
    }
     
    class B extends A {
     
      private final int f;
     
      B() {
        f = 1;
        m();
      }
     
      int i;
      void m() {
        i++;
        System.out.println("appel n° " + i + " -> f=" + f);
      }
    }
    et pourtant f est final !

  3. #3
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 23
    Par défaut
    Merci beaucoup je vais remanier mon code de ce pas

Discussions similaires

  1. [POO] Héritage et variable static
    Par Al3x dans le forum Langage
    Réponses: 3
    Dernier message: 23/12/2007, 18h27
  2. Classe et héritage, Problème de variable
    Par skyangel dans le forum Langage
    Réponses: 4
    Dernier message: 04/11/2007, 13h11
  3. Spécialisation des variables lors de l'héritage
    Par ::oliv:: dans le forum C++
    Réponses: 6
    Dernier message: 22/03/2007, 12h11
  4. Réponses: 7
    Dernier message: 30/09/2004, 13h55
  5. [héritage] héritage d'une variable static
    Par yaya44 dans le forum Langage
    Réponses: 14
    Dernier message: 29/09/2004, 14h36

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