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

2022-09-03 05:35:17

因此,当我遇到这种奇怪的现象时,我正在用一些代码片段进行测试,以围绕继承的概念。

所以首先我测试了这个简单的代码:

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行进行了一些小的更改,其中我将类型更改为如下所示:BarFoo

Foo bar = new Bar();

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

age = 2
TEST BAR

代码现在使用类的成员(这是有道理的),同时仍然使用类的方法(而不是来自Foo,因为这是类型是什么)是怎么发生的?bar.ageageFoobar.test();Bar


答案 1

阴影 中 的 。ageBarageFoo

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

所以当你写的时候,静态类型在访问字段时使用,返回2。在决定调用 哪个覆盖 时使用 动态类型,这是一种类型。Foo bar = new Bar();baragebartest()Bar


答案 2

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


推荐