如果你覆盖一个类的子类中的一个字段,子类有两个同名(但类型不同)的字段?

新手上路,请多包涵

我有3个班级:

 public class Alpha {
    public Number number;
}

public class Beta extends Alpha {
    public String number;
}

public class Gama extends Beta {
    public int number;
}

为什么下面的代码可以编译?而且,为什么测试通过而没有任何运行时错误?

 @Test
public void test() {
    final Beta a = new Gama();
    a.number = "its a string";
    ((Alpha) a).number = 13;
    ((Gama) a).number = 42;

    assertEquals("its a string", a.number);
    assertEquals(13, ((Alpha) a).number);
    assertEquals(42, ((Gama) a).number);
}

原文由 Kiril Kirilov 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 398
2 个回答

成员变量不能像方法一样被覆盖。 The number variables in your classes Beta and Gama are hiding (not overriding) the member variable number of the superclass.

通过强制转换,您可以访问超类中的隐藏成员。

原文由 Jesper 发布,翻译遵循 CC BY-SA 3.0 许可协议

字段不能被 _覆盖_;它们一开始就没有被多态访问——你只是在每种情况下声明一个新字段。

它编译是因为在每种情况下,表达式的编译时类型足以确定 哪个 字段称为 number 你的意思。

在实际编程中,您可以通过两种方式避免这种情况:

  • 常识:隐藏字段会使您的代码更难阅读,所以不要这样做
  • 可见性:如果您将所有字段设为私有,则子类无论如何都不会知道它们

原文由 Jon Skeet 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题