请考虑以下示例代码
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
遮蔽了基类中的变量。
为什么变量的绑定发生在编译时而不是运行时?这只是出于性能原因吗?
virtual
和override
,否则所有情况下都将具有编译时绑定。而且你无法用它们来操作变量。 - edc65