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 :

Héritage , surdéfinition et redefintion


Sujet :

avec Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 29
    Par défaut Héritage , surdéfinition et redefintion
    Salut les fous de java ,

    je trouve l ' héritage avec tout ce qui en découle assez difficile à saisir.je vais essayer de procéder par étapes :

    a)Lorsque j' instancie une classe fille B dont la classe mère est A , comment cela se passe t il exactement ?Par défaut j ' instancie la classe mère??

    b)Je ne peux pas accéder aux champs privés d' une classe mère ,quelle différence avec protected?


    c)Quand j utilise un constructeur , je construit bien un objet.
    J' ai bien compris qu il fallait utilisé super (..) (c 'est super quoi ) ,
    mais Est ce possible que ma classe fille ne possède pas de constructeur et que ma classe mère en possède un (pas le pseudo constructeur)??

    C 'est tout pour ce soir , je vais me coucher en éspérant avoir quelques petites réponses sympas.

    je poserais les questions sur les surdéfinitions et redéfinition dans le prochain épisode.Chose qui me parait assez ambigu.

    thanks aux javafous

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par jeremypd Voir le message
    Salut les fous de java ,

    je trouve l ' héritage avec tout ce qui en découle assez difficile à saisir.je vais essayer de procéder par étapes :

    a)Lorsque j' instancie une classe fille B dont la classe mère est A , comment cela se passe t il exactement ?Par défaut j ' instancie la classe mère??
    Non, tu n'a qu'une seule instance, qui est du type de la classe fille, mais qui par héritage est aussi du type de la classe mère. Le code des constructeurs des parents sont appelés en remontant jusqu'à l'Objet. Toutes les classes en java héritent de près ou de loin de Objet. Quand tu instancie une classe file, autant le code da fille que celui du parent travaillent sur une même instance. (A l'exception des méthodes statiques, car celles-ci ne sont pas liées à de instances). Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class A {
        public A() {
          System.out.println("In A(), my instance is "+this);
          System.out.println("In A(), my class is "+this.getClass().getName();
       }
    }
     
    public class B extends A {
        public B() {
          System.out.println("In B(), my instance is "+this);
          System.out.println("In B(), my class is "+this.getClass().getName();
       }
    }
    Va te sortir qqch comme ceci lorsque tu fera un new B()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    In A(), my instance is B@123456
    In A(), my class is B
    In B(), my instance is B@123456
    In B(), my class is B
    Citation Envoyé par jeremypd Voir le message
    b)Je ne peux pas accéder aux champs privés d' une classe mère ,quelle différence avec protected?
    Les champs privés sont limités en vue à la classe où ils sont défini. Les champs et méthodes protected sont accessible aux enfant ainsi qu'à toutes les classes du même "package"


    Citation Envoyé par jeremypd Voir le message
    c)Quand j utilise un constructeur , je construit bien un objet.
    J' ai bien compris qu il fallait utilisé super (..) (c 'est super quoi ) ,
    mais Est ce possible que ma classe fille ne possède pas de constructeur et que ma classe mère en possède un (pas le pseudo constructeur)??
    Toutes les classes possèdent un constructeur en JAVA, même si tu n'est pas toujours obligé de l'écrire quand tu déclare ta classe. Si, dans ton code, tu ne défini pas de constructeur, java va créer à la compilation un "constructeur par défaut" qui a la forme suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public <className>() {super();}
    Bien sûr, si ton parent n'a pas de constructeur sans argument, çà ne marchera pas et le compileur t'enverra une erreur! De même si tu défini un constructeur explicite dans une classe fille, mais que tu ne fait pas appel explicitement dans la première ligne à super(...), le compilateur va générer l'appel super() (appel au constructeur par défaut du parent). Si celui-ci n'existe pas, t'aura aussi une erreur.

    Tu as donc shématiquement ceci:

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    public class A {
        public B(int i){
            //....
        }
    }
     
    public class B extends A {
        // Pas de constructeur explicite pour B, le compilateur
        // crée un constructeur par défaut, qui appelle le constructeur 
        // sans argument de A. A n'a pas de constructeur sans argument
        // -> erreur!
    }
     
     
     
    public class C extends A {
        float a;
        public C(float a){
            this.a=a;
            // Pas d'appel explicite au constructeur du parent
            // java suppose alors un appel au constructeur sans argument
            // ce constructeur n'existe pas dans le parent
            // -> erreur!
        }
    }
     
    public class D extends A {
        float a;
        public D(float a){
            super(69);
            this.a=a;
            // Appel explicite au constructeur A(int) du parent
            // java ne génère alors aucun appel implicite
            // -> ok!
        }
        public D(){
            // ajouté pour démontrer E ;)
            this(3.14159f); 
            // appel au constucteur D(float) avec un paramètre
            // on peut chainer ainsi les constructeurs
            // -> ok
        }
    }
    public class E extends D {
        // aucun constructeur explicit, java
        // va générer un constructeur par défaut 
        // qui utilisera le constructeur sans
        // argument du parent ( D ) via super();
        // -> ok
    }

  3. #3
    Membre émérite
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Par défaut
    Prends un bon livre pour mettre à plat toute ces bases, cela te sera bénéfique.

    a) Non, tu n'instancie pas d'objet de type A, par contre lors de l'instanciation de ton objet B, il va s'initialiser en appelant un constructeur de chaqu'une des classes definissant sa généalogie.

    L'appel du constructeur parent devant toujours être la premiere instruction appelée (implicitement ou explicitement) dans un constructeur d'une classe fille, le résultat est que le constructeur de la classe Object est toujours le premier à s'executer lors de l'initialisation d'un objet (car tout objets dérive d'Object implicitement).

    b) Non tu pas acceder aux champs privés d'une classe mère. Au contraire tu peux acceder par héritage aux champs protected de cette derniere. Le mot clé "protected" permet de laisser accés a la propriété (ou méthode) toute classe dans le même package OU dérivant de la classe. (avec quelques subtilités)

    c) Si une classe ne posséde aucun constructeur, le compilateur en crééra un implicitement "public" ne prenant aucun paramêtre.

    Tout ceci mérite plus de détails, essai de te trouver un support qui te mettera tout ca au clair.

Discussions similaires

  1. héritage multipes, surdéfinitions des méthodes
    Par kimjoa dans le forum Langage
    Réponses: 8
    Dernier message: 09/01/2010, 18h46
  2. [JavaScript] [SRC] héritage javascript, et surdéfinition des méthodes
    Par kimjoa dans le forum Contribuez
    Réponses: 5
    Dernier message: 16/02/2009, 14h26
  3. surdéfinition de fonction et héritage
    Par kango dans le forum Débuter
    Réponses: 3
    Dernier message: 15/08/2008, 12h41
  4. [Postgres] Héritage + Clés
    Par k-reen dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 21/05/2003, 16h37
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

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