超类变量如何保存仅存在于子类中的数据成员值?

时间:2018-08-10 18:05:19

标签: java subclass superclass

我试图了解超类类型的变量如何将值存储在仅存在于子类中的数据成员中。

例如,在Java中,假设类Child扩展了ParentChild有一个数据成员childMember(假设它是int)。

这在Java中是合法的:

Parent parentObject = new Child(); ((Child)parentObject).childMember = 5;

但是parentObject如何存储childMember的值,因为它的类型为Parent并且Parent没有childMember?我知道它正在被强制设置值,但是由于它不是子对象,因此它甚至还需要数据成员来存储它吗?

2 个答案:

答案 0 :(得分:3)

在此代码中:

Parent parentObject = new Child(); 
((Child)parentObject).childMember = 5;

parentObject对象的实际/运行时类是Child,这说明了为什么所有这些方法都起作用。

  

但是parentObject如何存储childMember的值,因为它的类型为Parent,而父级没有childMember?

此问题更适用于以下代码:

Parent parentObject = new Parent(); 
((Child)parentObject).childMember = 5;

但是,在这种情况下,强制转换((Child)parentObject)将不起作用,并且Java会在运行时引发ClassCastException,正如您所期望的那样。

答案 1 :(得分:1)

首先,引用的类型为Parent,指向它的对象 的类型为Child,因此您的整个逻辑都可以正常工作如其他答案中所述。

但这是一个非常简单的例子,让我们做一个有趣的例子:

static class Parent {
    public int x = 5;
}

static class Child extends Parent {
    public int x = 3;
}

x有多少Child?好吧...

Arrays.stream(Child.class.getFields())
            .map(Field::getName)
            .forEachOrdered(System.out::println); // x AND x again

然后您如何访问它们中的每一个?

Child c = new Child();
System.out.println(c.x); // 3

Parent p = c;
System.out.println(p.x); // 5