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 :

[Just for fun] Overrider un attribut


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Braillane
    Profil pro
    Développeur Java
    Inscrit en
    Janvier 2007
    Messages
    212
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2007
    Messages : 212
    Par défaut [Just for fun] Overrider un attribut
    Bonjour,
    Je prépare actuellement ma certfication SCJP et je viens de découvrir (au cours de mes tests) que l'on pouvait overrider.... un attribut! L'objet qui override contiendra aussi bien la variable qu'il a overridé que la variable de son parent. Du coup ce n'est pas vraiment un override mais plutot une redéclartion de 2 variable avec le meme nom, l'une accessible via this.mavariable et l'autre via super.mavariable!

    Voici mon code de test :
    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
    package com.softixia;
     
    public class Parent {
    	protected String s2;
    	protected final String s = "Parent";
    	public void sayHello() {
    		System.out.println(this.getClass().toString());
    		System.out.println("Hello World!");
    		System.out.println("Chaine1 : "+this.s);
    		System.out.println("Chaine2 : "+this.s2);
    	}
    	public Parent() {
    		this.s2="parent";
    	}
    }
    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
    package com.other;
     
    import com.softixia.*;
    public class Enfant extends Parent {
    	String s = "Enfant";
    	public void test()
    	{
    		sayHello();
    		System.out.println(this.s);
    	}
    	public Enfant() {
    		this.s2="Enfant";
    	}
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package com.other;
     
    public class SousEnfant extends Enfant {
    	String s = "SousEnfant";
    	public void test2()
    	{
    		sayHello();
    		System.out.println(this.s);
    		System.out.println(super.s);
    	}
    	public SousEnfant() {
    		this.s2="SousEnfant";
    	}
    }
    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
    package com.softixia;
     
    import com.other.*;
    public class Launcher {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		Parent p = new Parent();
    		p.sayHello();
    		Enfant e = new Enfant();
    		e.sayHello();
    		e.test();
    		SousEnfant se = new SousEnfant();
    		se.sayHello();
    		se.test();
    		se.test2();
    	}
     
    }
    class com.softixia.Parent
    Hello World!
    Chaine1 : Parent
    Chaine2 : parent
    class com.other.Enfant
    Hello World!
    Chaine1 : Parent
    Chaine2 : Enfant
    class com.other.Enfant
    Hello World!
    Chaine1 : Parent
    Chaine2 : Enfant
    Enfant
    class com.other.SousEnfant
    Hello World!
    Chaine1 : Parent
    Chaine2 : SousEnfant
    class com.other.SousEnfant
    Hello World!
    Chaine1 : Parent
    Chaine2 : SousEnfant
    Enfant
    class com.other.SousEnfant
    Hello World!
    Chaine1 : Parent
    Chaine2 : SousEnfant
    SousEnfant
    Enfant
    Connaissiez-vous ce comportement?
    Trouvez vous sa logique?
    Depuis le SousEnfant comment accéder a la variable du parent (la classe "grandmère" quoi...)?

  2. #2
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 698
    Par défaut
    Je n'avais jamais essayé ça en particulier, mais je ne vois pas pourquoi ça n'aurait pas fonctionné ainsi. Ça me parait le comportement le plus logique.

    Ce comportement est au fond identique à ce qui est fait pour les méthodes.

  3. #3
    Membre confirmé Avatar de Braillane
    Profil pro
    Développeur Java
    Inscrit en
    Janvier 2007
    Messages
    212
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2007
    Messages : 212
    Par défaut
    C'est quand même pas pareil que les méthodes je trouve. Dans une méthodes on a les variables de classe et les variables locale, donc ya une différence de portée.
    La quand on hérite un attribut on est censé y accédé grâce a this.Les deux variables déclarés ont exactement la même porté et le même nom. Honnetement je m'attendais à une erreur de compilation.
    Mais bon visiblement ma connaissance de Java est encore loin d'etre parfaite!

  4. #4
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 698
    Par défaut
    En fait je ne parlais pas de portée mais je trouvais qu'un attribut était surchargé comme l'était une méthode.
    Ainsi, dans la classe fille on accède plus aux élément de la classe mère s'ils ont été redéfinis (que ce soit pour les méthode ou les attributs). Si l'on veut y accéder, on utilise super.

    Cependant mon raisonnement n'est pas non plus exact vu que sur les attributs, il n'y a visiblement pas de polymorphisme.
    En effet dans le code suivant in.getVar() vaut 20 alors que in.var vaut 10
    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
    public class Main {
        public static void main(String[] args) {
            Mere in = new Fille();
            System.out.println(in.getVar());
            System.out.println(in.var);
        }
    }
     
    class Mere {
        int var = 10;
        public int getVar() { return var; }
    }
     
    class Fille extends Mere {
        int var = 20;
        public int getVar() { return var; }
    }

  5. #5
    Invité
    Invité(e)
    Par défaut
    Salut,

    Tu peux regarder cette discussion qui se rapproche de ton problème (avec le coup des méthodes privées en plus). Il n'y a donc pas de liaison tardive sur les attributs et le type déclaré est utilisé.

    A plus

  6. #6
    Membre confirmé Avatar de Braillane
    Profil pro
    Développeur Java
    Inscrit en
    Janvier 2007
    Messages
    212
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2007
    Messages : 212
    Par défaut
    Merci Georges7 pour ce lien. En effet ça explique pas mal de chose! C'est vrai que peu de monde connait le fonctionnement exact de la jvm!

Discussions similaires

  1. Delphi for Fun
    Par Simicro dans le forum Contribuez
    Réponses: 0
    Dernier message: 11/07/2012, 20h57
  2. Réponses: 30
    Dernier message: 12/01/2009, 09h08
  3. Progressbar (just for fun)
    Par fring dans le forum Contribuez
    Réponses: 5
    Dernier message: 14/08/2008, 23h51
  4. Progressbar (just for fun)
    Par fring dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 03/04/2008, 15h40
  5. [astuce] équivalent de l'attribut for en javascript
    Par Mr N. dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/02/2006, 08h40

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