为什么 Java 在编译时绑定变量?
请考虑以下示例代码
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