我对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并不是那样的! 为什么?
答案 0 :(得分:2)
您在这里处理的是polymorphism。 c
被实例化为new child()
,这就是您将child
作为输出的原因。 p
属于parent
类型的事实并未改变这一事实,它仍然指向child
的实例。
答案 1 :(得分:1)
由于行parent p = c;
想象一下:
class Car {
public void whatAreYou() {
System.out.println("Car");
}
}
class Cadillac extends Car {
public void whatAreYou() {
System.out.println("Caddillac");
}
}
如果你现在说
Cadillac coolCar = new Cadillac();
Car testCar = coolCar;
testCar.whatAreYou();
很明显输出是“凯迪拉克”,不是吗?这就是你如何看待继承:
凯迪拉克的物品总是汽车。汽车对象可以凯迪拉克
由于我明确地将凯迪拉克参考coolCar
设置为指向凯迪拉克的对象,并且汽车参考testCar
指向同一个对象,因此我们得到输出“凯迪拉克”
为了使它更加明显,你甚至可以说
Car coolCar = new Cadillac();
Car testCar = coolCar;
testCar.whatAreYou();
答案 2 :(得分:1)
这是你做过的事情
孩子c =新孩子();
您创建了Object of Class类并将其引用分配给c。
父母p = c;
这里您已将子对象的引用复制到p。请记住,对象仍然是Child的对象,而不是父对象。
p.whatAreYou();
这里你调用了whatAreYou方法。你是使用指向子对象的引用变量p来调用它的。因此将调用孩子的方法。
另一种解释