在继承中堕落

时间:2014-08-03 12:17:43

标签: java

我知道对象中的向上/向下转换不会改变对象,而是改变我们处理对象的方式。 (或者如果我理解正确的话,改变他们的参考类型。)

但是,如果我们有一个具有getName()的Animal类;方法,以及作为Animal的子类的狗类。

Animal Billy = new Animal("billy",1);
Dog b = (Dog)Billy;
b.getName();

我明白它会编译,但是会给出运行时错误,我的问题是为什么,getName();方法存在于Animal类中,因此它是由Dog类继承的,所以它存在于两者中,是什么阻止我们完成它?

1 个答案:

答案 0 :(得分:4)

每当你向下转发时,首先使用instanceof运算符检查它。

Animal billy = new Animal("billy",1);

if (billy instanceof Dog) {
    Dog b = (Dog) billy;
    b.getName();
}

因为Animal可以是任何CatDog等等。它在编译时不知道,因此在向下转发之前你必须检查它。


  getName()类中存在

Animal方法,因此它由Dog类继承,因此它存在于两者中,阻止我们使用它做什么?

没有什么可以阻止你,但你必须如下所示。

如果getName()类中存在Animal方法,则无需向下转贴,只需在Animal类的引用和getName()的{​​{1}}方法上调用它将调用{1}}类。

Dog

详细了解Overriding and Hiding Methods

enter image description here