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

Java Discussion :

Héritage et constructeurs


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Points : 22
    Points
    22
    Par défaut Héritage et constructeurs
    Bonjour.
    J'ai une classe City :
    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
    35
    36
    37
    38
    39
     
    package com.OCR.classes1;
     
    public class City {
     
        protected String name;
        protected String country;
        protected int inhabitants;
        protected static int nb = 0;
     
        public City() { nb++; }
     
        public City(String name, String country, int inhabitants) {
            setName(name);
            setCountry(country);
            setInhabitants(inhabitants);
            nb++;
        }
     
        public void presentation() {
            System.out.println("Nom : " + this.name + "\nPays : " + this.country + "\nHabitants : " + this.inhabitants
            + "\nNombre de villes : " + nb);
     
        }
     
        // Getters & Setters
     
        public String getName() { return this.name; }
     
        public String getCountry() { return this.country; }
     
        public int getInhabitants() { return this.inhabitants; }
     
        public void setName(String name) { this.name = name; }
     
        public void setCountry(String country) { this.country = country; }
     
        public void setInhabitants(int inhabitants) { this.inhabitants = inhabitants; }
    }
    Et une classe Capital qui hérite de City :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    package com.OCR.classes1;
     
    public class Capital extends City {
     
        public Capital() {
            nb++;
        }
     
        public Capital(String name, String country, int inhabitants) {
     
        }
    }
    Dans mon main, lorsque je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Capital lyon = new Capital();
    J'ai ma variable de classe nb, qui vaut 2, je l'ai donc incrémenté 2 fois. Lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Capital lyon = new Capital("Lyon", "France", 300_000);
    J'ai ma variable de classe nb qui vaut 1, mais les autres attributs valent null et 0.

    J'ai donc l'impression que si je ne fais pas appel explicitement à un constructeur dans ma classe fille, lors de l'instanciation de ma classe fille, j'aurai toujours un appel implicite à mon constructeur par défaut. Pourquoi ?
    Merci à vous

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2013
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2013
    Messages : 191
    Points : 472
    Points
    472
    Par défaut
    Comme son nom l'indique : par défaut, c'est le constructeur par défaut qui est appelé.
    Donc peu importe le nombre de paramètre dans le constructeur fils, si tu ne précises pas dans ton code que tu veut appeler le constructeur père paramétré avec un super(param1, params2 ...) au début du constructeur fils, c'est le constructeur père par défaut qui est appelé.

    La c'est ce qu'il se passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public Capital(String name, String country, int inhabitants) {
     
        }
    Revient a faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public Capital(String name, String country, int inhabitants) {
         super();
        }
    Donc tu ne passes pas dans le constructeur City(String name, String country, int inhabitants).

    Tu est obligé de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public Capital(String name, String country, int inhabitants) {
         super(name, country, inhabitants);
        }

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Points : 22
    Points
    22
    Par défaut
    Super, merci pour ta réponse c'est vraiment clair !

    Tu me confirmes bien que dans le constructeur d'une classe fille, j'aurai toujours un appel vers un constructeur de la classe mère, soit implicitement (le constructeur par défaut) soit explicitement, avec un super parametré ?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Bien sûr, c'est comme ça que ça marche les langages de classe.

    Il faut bien construire la structure de la classe mère, donc il faut bien que l'un ou l'autre de ses constructeurs soit appelé d'une manière ou d'une autre, avant de s'intéresser à ce que fait la classe fille.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2013
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2013
    Messages : 191
    Points : 472
    Points
    472
    Par défaut
    Oui tu as forcément un appel au constructeur de la classe mère
    Et si le constructeur par défaut n'existe pas et que tu n'utilise pas un super(param1 [, param2, param3 ...]) dans la classe fille pour dire au compilateur quel constructeur père utiliser avec quels arguments, alors tu auras une erreur lors de la compilation

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Points : 22
    Points
    22
    Par défaut
    Merci à vous
    Une dernière question avant de cloturer le sujet.

    J'ai appris que si aucun constructeur n'est spécifié dans une classe, la jvm se charge d'en créer un par défaut. Du coup, si j'avais écrit ma classe Capital sans constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public class Capital extends City {
    }
    En exécutant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Capital paris = new Capital();
    Dans un premier temps, comme Capital ne contient pas de constructeur,la jvm en créé un par défaut, et celui-ci fait l'appel au constructeur par défaut du père, qui lui va incrémenter ma variable nb.
    C'est bien cela ? J'ai bien pigé la logique xD ?
    Merci encore pour vos réponses

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Oui.

    Le constructeur par défaut d'une classe est équivalent à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public NomDeLaClasse() {
      super();
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Points : 22
    Points
    22
    Par défaut
    Super !
    je vous remercie pour la rapidité et la qualité de vos réponses

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/09/2007, 14h01
  2. [POO] héritage de constructeurs
    Par benkunz dans le forum Langage
    Réponses: 2
    Dernier message: 03/04/2007, 15h29
  3. Héritage et constructeur
    Par shirya dans le forum C#
    Réponses: 2
    Dernier message: 07/02/2007, 17h23
  4. Réponses: 10
    Dernier message: 20/09/2006, 17h04
  5. [POO]héritage du constructeur de la classe parente
    Par new_wave dans le forum Langage
    Réponses: 7
    Dernier message: 10/03/2006, 14h25

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