Si consideri il seguente codice di esempioPerché Java associa le variabili al momento della compilazione?
class MyClass {
public String var = "base";
public void printVar() {
System.out.println(var);
}
}
class MyDerivedClass extends MyClass {
public String var = "derived";
public void printVar() {
System.out.println(var);
}
}
public class Binding {
public static void main(String[] args) {
MyClass base = new MyClass();
MyClass derived = new MyDerivedClass();
System.out.println(base.var);
System.out.println(derived.var);
base.printVar();
derived.printVar();
}
}
dà il seguente risultato
base
base
base
derived
chiamate di metodo vengono risolte in fase di esecuzione e il metodo override corretto è chiamato, come previsto.
L'accesso alle variabili è invece risolto in fase di compilazione come ho appreso in seguito. mi aspettavo un'uscita come
base
derived
base
derived
perché nella classe derivata la ridefinizione var
ombre uno nella classe base.
Perché il binding delle variabili avviene in fase di compilazione e non in fase di runtime? È solo per motivi di prestazioni?
Una nota a margine per un linguaggio simile: in C# avrai tempo di compilazione vincolante in tutti i casi, a meno di utilizzare specificatamente 'virtuale 'e' override'. E non puoi usarli per le variabili. – edc65
Correlati: http://stackoverflow.com/questions/13748124/why-java-polymorphism-not-work-in-my-example – user11153