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 :

cannot reference this before supertype constructor has been called


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 31
    Points : 23
    Points
    23
    Par défaut cannot reference this before supertype constructor has been called
    Je cherche à créer un arbre en java, dont tout les éléments hérite de A, puis division en sous classe. malheureusement dés le deuxième héritage, j'ai un problème au niveau du constructeur.

    Voilà un exemple simplifié, à la compilation j'obtiens :

    cannot reference this before supertype constructor has been called

    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
    public class A {
     
    	public A() {
    	}
     
     
    	public class B extends A{
    		public B() {
    			super();
    		}
    	}
     
    	public class C extends B{
    		public C() {
    			super();
    		}
    	}
     
    }
    Merci pour le coup de main

  2. #2
    Membre averti Avatar de clubist
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 217
    Points : 301
    Points
    301
    Par défaut
    Bonjour,

    dans ce cas vous avez déclaré les classes B et C dans la classe A donc B et C sont deux inner Classe.

    Donc le problème est que vous appelez le constructeur de B par super et ce constructeur appelle le constructeur de superclasse (constructeur de A) avant même de créer une instance A c'est à dire que vous essayez d'utiliser une instance de A qu'elle n'a pas été encore instancié comme vous voulez boire de lait bien qu'il est en cours d'emballage (juste pour titre d'exemple) c'est le fait que vous êtes dans la classe A et vous utilisez son constructeur

    La solution :écrire chaque classe à part (quelque soit la place dans un seul fichier.java (dans ce cas il faut définir une seule classe comme public et le fichier doit prendre le nom de la classe public )ou dans 3 fichier différents).

    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
     
    public class A {
     
    public  A() {
    	}
     
    }
    	  class B extends A{
    		public B() {
            super();
    		}
     
         }
     
    	class C extends B{
    		public C() {
        super();
     
    		}
    	}

  3. #3
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Bonjour,

    En fait ce problème est un problème de scope.
    La classe A existe et la classe B a bien accès au constructeur de la classe A. Mais la classe B existe que si A est instancié (elle est membre de A). Donc de fait quand on tente de faire référence à un membre de B à partir de C (ici le constructeur) il n'existe pas encore.
    Pour que ca marche faut utiliser des classes statiques :

    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
    public class A {
     
    	public A() {
    	}
     
     
    	public static class B extends A{
    		public B() {
    			super();
    		}
    	}
     
    	public class C extends B{
    		public C() {
    			super();
    		}
    	}
     
    }
    Ici la définition de la classe B sort du scope de l'instance de A.
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

Discussions similaires

  1. Warning: Call-time pass-by-reference has been deprecated
    Par Poseidon62 dans le forum Langage
    Réponses: 8
    Dernier message: 16/10/2011, 16h03
  2. Réponses: 0
    Dernier message: 09/10/2010, 17h32
  3. Réponses: 0
    Dernier message: 09/10/2010, 17h20
  4. Classe JDialog + cannot reference parent before supertype constructor has been called
    Par une_tite_question dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 08/04/2008, 15h51
  5. Check this out : Aerith source code has been released
    Par bbclone dans le forum AWT/Swing
    Réponses: 17
    Dernier message: 06/07/2006, 18h18

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