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

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在你的类变量BetaGama隐藏(未覆盖)的成员变量number的超类的.

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

  • 请参见Java™教程[隐藏字段](https://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html) (3认同)

Jon*_*eet 45

字段不能被覆盖 ; 它们首先不是多态访问的 - 你只是在每种情况下声明一个新字段.

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

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

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