代码之家  ›  专栏  ›  技术社区  ›  moffeltje

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

  •  16
  • moffeltje  · 技术社区  · 7 年前

    所以我用一些代码片段来测试继承的概念,当我遇到这个——对我来说——奇怪的现象时。

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

    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 委员会成员 类(这很有意义),而 bar.test(); 仍然使用 酒吧 类(而不是来自Foo,因为这是类型)?

    2 回复  |  直到 7 年前
        1
  •  22
  •   Bathsheba    7 年前

    这个 age 在里面 Bar 阴影 这个 年龄 在里面 Foo .

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

    所以当你写作的时候 Foo bar = new Bar(); 这个 静止的 类型 bar 访问字段时使用 年龄 ,返回2。以及 动态 类型 酒吧 在决定的覆盖时使用 test() 打电话,这是一个 酒吧 类型

        2
  •  4
  •   Maurice Perry    7 年前

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

    推荐文章