为什么我能够访问父类中的子方法?

时间:2014-10-24 09:14:46

标签: java inheritance

我对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并不是那样的! 为什么?

3 个答案:

答案 0 :(得分:2)

您在这里处理的是polymorphismc被实例化为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来调用它的。因此将调用孩子的方法。 enter image description here

另一种解释

enter image description here