fic*_*ion 51 java subclassing jls
我有3个班:
public class Alpha {
public Number number;
}
public class Beta extends Alpha {
public String number;
}
public class Gama extends Beta {
public int number;
}
Run Code Online (Sandbox Code Playgroud)
为什么以下代码编译?而且,为什么测试通过没有任何运行时错误?
@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);
}
Run Code Online (Sandbox Code Playgroud)
Jes*_*per 67
成员变量不能像方法一样被覆盖.将number在你的类变量Beta和Gama被隐藏(未覆盖)的成员变量number的超类的.
通过强制转换,您可以访问超类中的隐藏成员.
Jon*_*eet 45
字段不能被覆盖 ; 它们首先不是多态访问的 - 你只是在每种情况下声明一个新字段.
它编译,因为在每种情况下的表达式的编译时类型就足以确定哪些领域称为number你的意思.
在实际编程中,您可以通过两种方式避免这种情况: