【发布时间】:2015-12-02 01:55:15
【问题描述】:
考虑以下示例代码
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 会影响基类中的定义。
为什么变量的绑定发生在编译时而不是运行时?这仅仅是出于性能原因吗?
【问题讨论】:
-
类似语言的旁注:在 C# 中,您将在所有情况下都有编译时绑定,除非您专门使用
virtual和override。而且你不能将它们用于变量。
标签: java inheritance jls