Quelqu'un peut-il me clarifier. Ici, la méthode d'instance est surchargée mais la variable ne l'est pas. sortie est: B 10
Héritage avec une variable en Java
class A{
int i=10;
public void name(){
System.out.println("A");
}
}
class B extends A{
int i=20;
public void name(){
System.out.println("B");
}
}
public class HelloWorld {
public static void main(String[] args){
A a = new B();
a.name();
System.out.println(a.i);
}
}
Les appels de méthode sont liés _dynamically_ (ce qui signifie qu'ils sont résolus au moment de l'exécution) alors que les accès aux variables d'instance sont liés _statically_ (ce qui signifie qu'ils sont résolus au moment de la compilation). Et le compilateur utilise toujours le type _declared_ d'une variable pour résoudre ses variables d'instance. – Seelenvirtuose
@Seelenvirtuose +1 pour cette explication simple et agréable – procrastinator
Oui, vous avez raison. Pour accéder à une variable de la classe ou une instance est utilisé le getstatic ou getfield, le bytecode ne trouve pas la super classe, mais invoque le La méthode qui remplace sa méthode de superclasse exécutera invokevirtual, le bytecode trouvera la méthode de superclasse. – dabaicai