Partage
  • Partager sur Facebook
  • Partager sur Twitter

Héritage par défaut du constructeur de la classe Mère ?

Sujet résolu
    6 mai 2012 à 13:35:49

    Bonjour,

    Je viens de découvrir quelque chose en Java, le constructeur de la classe Mère est hérité par défaut !
    Bon cela peut vous paraître normal, mais développant avec d'autres langages, cela me paraît étrange.

    class Mere {
    	
    	private String a;
    	private String b;
    	
    	public Mere(){
    		this.a = "Hello";
    	}
    	
    	public Mere(int abc){
    		this.b = "Hello";
    	}
    	
    	public String getA(){return this.a;}
    	public String getB(){return this.b;}
    }
    
    
    class Fille extends Mere{
    
    	// Constructeur par défaut vide de la classe Fille
    	public Fille(){}
    	
    	// Constructeur vide de la classe Fille
    	public Fille(int abc){}
    	
    }
    
    
    public class Main {
    	public static void main(String[] args){
    		Mere mere = new Mere(1);
    		Fille fille = new Fille(1);
    		
    		System.out.println("mere a: "+mere.getA());
    		System.out.println("mere b: "+mere.getB());
    		System.out.println("fille a: "+fille.getA());
    		System.out.println("fille b: "+fille.getB());
    	}
    }
    


    Affichage :
    mere a: null
    mere b: Hello
    fille a: Hello
    fille b: null


    Pourtant je n'ai pas mis super() dans le constructeur de la classe Fille, est-ce que c'est normal ?


    Il me semble aussi que cela ne fonctionne qu'avec le constructeur sans argument (par défaut).


    Merci :)
    • Partager sur Facebook
    • Partager sur Twitter
    Site : https://gokan-ekinci.appspot.com | Miagiste en recherche d'emploi | Profil [Dév. Java SE & EE | Dév. QlikView]
      6 mai 2012 à 13:56:38

      En fait, en Java, la première action d'un constructeur est toujours d'appeler un constructeur de l'objet parent, pour pouvoir construire cet objet parent correctement.
      Donc, si tu ne le précise pas, le compilateur ajoute tout seul un appel au constructeur parent vide super(); au début de ton constructeur personnalisé - de la même manière que le compilateur crée tout seul le constructeur vide si tu ne le déclare pas.

      Pour moi c'est logique : quand tu crées ta classe fille, elle dérive de la classe mère. Tu ne construit donc pas une classe indépendante, il faut que ta classe mère soit correctement créée aussi - donc qu'un constructeur soit appelé.

      PS : ça se vérifie très bien sur n'importe quel type de constructeur en jouant avec le débugger : tu fais "entrer dans la méthode appelée" au début de ton constructeur perso, tu verras que tu entres dans le constructeur parent, et ceci en chaîne jusqu'à arriver à Object.
      Ca explique aussi pourquoi tu peux te passer du super(); en début de code sauf quand la classe parent n'a pas de constructeur vide (exemple : une exception).
      • Partager sur Facebook
      • Partager sur Twitter
        6 mai 2012 à 14:46:30

        Merci beaucoup pour ton explication SpaceFox. :)
        Le comportement reste semblable au C++ ici (appel au constructeur par défaut de la classe Mere dans la classe Fille), mais il n'en est pas de même pour le PHP.

        Sujet résolu.
        • Partager sur Facebook
        • Partager sur Twitter
        Site : https://gokan-ekinci.appspot.com | Miagiste en recherche d'emploi | Profil [Dév. Java SE & EE | Dév. QlikView]

        Héritage par défaut du constructeur de la classe Mère ?

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown