为什么变量在覆盖时的行为与方法不同?

mav*_*vis 4 java inheritance overriding

通常,Overriding是重新定义子类中成员含义的概念.为什么变量在重写时不像java中的方法?
例如:

class Base {

    int a = 10;

    void display() {
        System.out.println("Inside Base :");
    }
}

class Derived extends Base {

    int a = 99;

    @Override
    // method overriding
    void display() {
        System.out.println("Inside Derived :");
    }
}

public class NewClass {

    public static void main(String... a) {
        Derived d = new Derived();
        Base b = d;
        b.display(); // Dynamic method dispatch
        System.out.println("a=" + b.a);
    }
}
Run Code Online (Sandbox Code Playgroud)

由于数据成员a是指定的包访问,因此Derived该类也可以使用它.但通常在使用基类引用调用重写方法时,会调用派生类中重新定义的方法(动态方法调度)..但对于变量..why,它是不一样的.

预期输出

内部派生:
a = 99

获得的输出:

内部衍生:
a = 10

打印10 - 为什么变量的行为与派生类中的方法不相似?
为什么不允许在子类中重写变量?

jas*_*son 6

您键入b的实例Base.因此,当编译器需要解析时b.a,它会查找为其Base含义的定义b.a.实例字段没有多态性.