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

我有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);

}


叮当猫咪
浏览 397回答 2
2回答

幕布斯7119047

成员变量不能像方法一样被覆盖。将number在你的类变量Beta和Gama被隐藏(未覆盖)的成员变量number的超类的。通过强制转换,您可以访问超类中的隐藏成员。

慕少森

字段不能被覆盖 ; 最初并没有多态地访问它们-您只是在每种情况下都声明了一个新字段。它编译,因为在每种情况下的表达式的编译时类型就足以确定哪些领域称为number你的意思。在实际编程中,您可以通过两种方式避免这种情况:常识:阴影字段使您的代码更难以阅读,因此请不要这样做可见性:如果您将所有字段设为私有,则子类将一无所知
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java