为了账号安全,请及时绑定邮箱和手机立即绑定

如果覆盖类的子类中的字段,则子类有两个名称相同(类型不同)的字段?

如果覆盖类的子类中的字段,则子类有两个名称相同(类型不同)的字段?

叮当猫咪 2019-11-30 13:37:22
我有3节课:public class Alpha {    public Number number;}public class Beta extends Alpha {    public String number;}public class Gama extends Beta {    public int number;}为什么以下代码会编译?而且,为什么测试通过但没有任何运行时错误?@Testpublic 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);}
查看完整描述

2 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

成员变量不能像方法一样被覆盖。将number在你的类变量BetaGama隐藏(未覆盖)的成员变量number的超类的。

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


查看完整回答
反对 回复 2019-11-30
?
慕少森

TA贡献2019条经验 获得超9个赞

字段不能被覆盖 ; 最初并没有多态地访问它们-您只是在每种情况下都声明了一个新字段。

它编译,因为在每种情况下的表达式的编译时类型就足以确定哪些领域称为number你的意思。

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

  • 常识:阴影字段使您的代码更难以阅读,因此请不要这样做

  • 可见性:如果您将所有字段设为私有,则子类将一无所知


查看完整回答
反对 回复 2019-11-30
  • 2 回答
  • 0 关注
  • 396 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信