我有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
在你的类变量Beta
和Gama
被隐藏(未覆盖)的成员变量number
的超类的。
通过强制转换,您可以访问超类中的隐藏成员。

慕少森
TA贡献2019条经验 获得超9个赞
字段不能被覆盖 ; 最初并没有多态地访问它们-您只是在每种情况下都声明了一个新字段。
它编译,因为在每种情况下的表达式的编译时类型就足以确定哪些领域称为number
你的意思。
在实际编程中,您可以通过两种方式避免这种情况:
常识:阴影字段使您的代码更难以阅读,因此请不要这样做
可见性:如果您将所有字段设为私有,则子类将一无所知
添加回答
举报
0/150
提交
取消