我知道对象中的向上/向下转换不会改变对象,而是改变我们处理对象的方式。 (或者如果我理解正确的话,改变他们的参考类型。)
但是,如果我们有一个具有getName()的Animal类;方法,以及作为Animal的子类的狗类。
Animal Billy = new Animal("billy",1);
Dog b = (Dog)Billy;
b.getName();
我明白它会编译,但是会给出运行时错误,我的问题是为什么,getName();方法存在于Animal类中,因此它是由Dog类继承的,所以它存在于两者中,是什么阻止我们完成它?
答案 0 :(得分:4)
每当你向下转发时,首先使用instanceof
运算符检查它。
Animal billy = new Animal("billy",1);
if (billy instanceof Dog) {
Dog b = (Dog) billy;
b.getName();
}
因为Animal
可以是任何Cat
,Dog
等等。它在编译时不知道,因此在向下转发之前你必须检查它。
getName()
类中存在
Animal
方法,因此它由Dog
类继承,因此它存在于两者中,阻止我们使用它做什么?
没有什么可以阻止你,但你必须如下所示。
如果getName()
类中存在Animal
方法,则无需向下转贴,只需在Animal
类的引用和getName()
的{{1}}方法上调用它将调用{1}}类。
Dog
详细了解Overriding and Hiding Methods