在以下程序中。方法按动态调用。但是如何动态调用变量呢。为什么不能这样做?
class Super {
public int field = 0;
public int getField() {
return field;
}
}
class Sub extends Super {
public int field = 1;
public int getField() {
return field;
}
public int getSuperField() {
return super.field;
}
}
public class FieldAccess {
public static void main(String[] args) {
Super sup = new Sub();
System.out.println("sup.field = " + sup.field + ", sup.getField() = " + sup.getField());
Sub sub = new Sub();
System.out.println("sub.field = " + sub.field + ", sub.getField() = " + sub.getField() + ", sub.getSuperField() = "+ sub.getSuperField());
}
}
输出:
sup.field = 0, sup.getField() = 1
sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0
这里,如果可以动态找到sup.method(),为什么我们不能动态获得sup.variable?
有可能吗?如果不是为什么?
当我们有(超级)动物--->狗,猫,狮子我们称它的方法说makeNoise()我们分别接受树皮或喵喵叫。但为什么不问我们的名字并相应地得到它呢?
答案 0 :(得分:2)
在Java中,成员变量具有静态绑定,因为Java不允许使用成员变量进行多态行为。
private
方法,因为它们永远不会被继承,编译器可以解析它们
仅在编译时调用任何私有方法。因此静态绑定。
其次,请考虑以下代码..
class SuperClass{
...
public String someVariable = "SuperClass";
...
}
class SubClass extends SuperClass{
...
public String someVariable = "SubClass";
...
}
...
...
SuperClass superClass1 = new SuperClass();
SuperClass superClass2 = new SubClass();
System.out.println(superClass1.someVariable);
System.out.println(superClass2.someVariable);
...
输出: - 超类 父类
成员变量仅基于声明的对象引用类型进行解析, 编译器能够尽早在编译时找到它 因此在这种情况下是静态绑定。
总之,基本上Java开发人员不希望这些检查在运行时发生并在此时获得异常。
答案 1 :(得分:1)
当你超越超级方法时。
public int getField() {
return field;
}