为什么更改类型会导致成​​员使用不同?

时间:2017-12-05 11:46:43

标签: java class inheritance member

所以我正在测试一些代码片段,以便围绕继承的概念进行测试,当我遇到这个 - 对我来说 - 奇怪的现象。

首先,我正在测试这个简单的代码:

public class Main{
    public static void main(String[] args) {
        Bar bar = new Bar();

        System.out.println("age = " + bar.age);

        bar.test();
    }
}

class Foo{
    int age = 2;

    void test(){
        System.out.println("TEST FOO");
    }
}

class Bar extends Foo{
    int age = 4;

    void test(){
        System.out.println("TEST BAR");
    }
}

输出符合我的预期:

age = 4
TEST BAR

然后我对第3行做了一个小改动,在那里我将类型Bar更改为Foo,如下所示:

Foo bar = new Bar();

现在当我运行代码时,它给了我一个我相信很奇怪的输出:

age = 2
TEST BAR

代码bar.age现在如何使用age类的Foo成员(这是有意义的),而bar.test();仍使用Bar类(而不是Foo,因为那是类型)?

2 个答案:

答案 0 :(得分:22)

age 阴影中的Bar age中的Foo

此外,字段多态(参见函数)。

因此,当您撰写Foo bar = new Bar();时,在访问字段bar时会使用静态类型的age,并返回2. 在决定调用哪个bar覆盖时使用test()的动态类型,这是Bar类型。

答案 1 :(得分:4)

因为您已经定义了两个不同的年龄字段,每个类别中有一个。字段不会被覆盖。