[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:
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:
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:
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:
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();
}
} |
Citation:
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...)?