Рассмотрим следующий пример кода
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();
}
}
он дает следующий выход
base
base
base
derived
Вызов метода разрешен во время выполнения и вызывается правильный переопределенный метод, как и ожидалось.
Доступ к переменным вместо этого разрешен во время компиляции, как я узнал позже.
Я ожидал выхода как
base
derived
base
derived
потому что в производном классе переопределение var
затеняет одно в базовом классе.
Почему привязка переменных происходит во время компиляции, а не во время выполнения? Это только по соображениям производительности?