为什么java不支持动态变量调度

sya*_*yam 4 java inheritance

如果标题错误,请原谅.有两个类Test和TestChild1,其中TestChild1继承自Test.这两个类都有一个名为"a"的变量.当我尝试通过使用子类对象实例化的超类变量访问变量"a"时,它给出了在超类而不是子类中初始化的值.以下是提出疑问的代码

class Test {
    public int a = 10;
}

class TestChild1 extends Test {
    public int a = 20;
}

class Main {
    public static void main(String args[]) {
        Test test = new TestChild1();
        System.out.println(test.a); // results in 10
    }
}
Run Code Online (Sandbox Code Playgroud)

请告诉我这种行为的原因.提前致谢....

JB *_*zet 9

因为Java设计者决定使方法具有多态性(因此可以覆盖),而不是字段.

当您从对象引用字段时,编译器根据声明的变量类型决定使用哪个字段,在本例中为Test.

当您引用方法时,JVM在运行时根据对象的实际具体类型选择调用哪个方法,在本例中为TestChild.

OO完全是关于状态的封装,所以你几乎不应该将字段暴露给外部.