java为什么我能够访问父类中的子方法?
我在理解Java中的继承时遇到了一个问题:当我将子类转换回父类时,我能够访问子类的重写方法
例如,给出了以下两类:
父对象:
public class Parent {
public void whatAreYou() {
System.out.println("parent");
}
}
和子类:
public class Child extends Parent {
@Override
public void whatAreYou() {
System.out.println("child");
}
public void onlyChildrenCanDoThis() {
//...
}
}
当我现在执行以下操作时:
Child c = new Child();
Parent p = c;
p.whatAreYou();
我得到这个输出:
child
这对于我理解Java中的继承是非常奇怪的。我希望得到parent
输出,因为我将子类缩小到父类,这样我就可以访问父类的变量和方法
这是使用p.onlyChildrenCanDoThis()
,因为我无法访问它,因为它没有在父类中实现
。。。但是对于被覆盖的方法,Java的行为不是这样的为什么强>
# 1 楼答案
以下是你所做的
您创建了子类的对象,并将其引用指定给c
在这里,您已将子对象的引用复制到p。请记住,该对象仍然是子对象,而不是父对象
这里你称之为whatAreYou方法。您正在使用指向子对象的引用变量p调用它。因此将调用child的方法。
另一种解释
# 2 楼答案
你要处理的是polymorphism
c
被实例化为new child()
,这就是为什么child
作为输出。p
属于parent
类型的事实并没有改变这个事实,它仍然指向child
的实例# 3 楼答案
由于行
parent p = c;
的缘故,输出保持原样想象一下:
如果你现在说
很明显,输出是“凯迪拉克”,不是吗?以下是您看待继承的方式:
凯迪拉克的物体总是汽车。汽车对象可以是凯迪拉克
由于我显式地将凯迪拉克引用
coolCar
设置为指向凯迪拉克的一个对象,将汽车引用testCar
设置为指向同一个对象,因此我们得到了输出“凯迪拉克”更明显的是,你甚至可以说