Cat cat=(Cat)animal;//编译时是按Cat类型,为什么运行时是按Dog类型?

来源:10-2 多态中的引用类型转换

不规则饼干

2015-03-02 23:40

是不是因为在他之上有 Dog dog2=(Dog)animal;这一句,已经把animal转成了Dog类型,所以运行时是按照Dog类型?

写回答 关注

2回答

  • 不规则饼干
    2015-03-07 23:16:00

    有解答么。。。

  • Coda
    2015-03-03 09:29:05

    在继承中,子类向父类转换称为“向上转型”,将父类向子类转换称为“向下转型”。
    很多时候,我们会将变量定义为父类的类型,却引用子类的对象,这个过程就是向上转型。程序运行时通过动态绑定来实现对子类方法的调用,也就是多态性。
    然而有些时候为了完成某些父类没有的功能,我们需要将向上转型后的子类对象再转成子类,调用子类的方法,这就是向下转型。
    注意:不能直接将父类的对象强制转换为子类类型,只能将向上转型后的子类对象再次转换为子类类型。也就是说,子类对象必须向上转型后,才能再向下转型。

    因为向下转型存在风险,所以在接收到父类的一个引用时,请务必使用 instanceof 运算符来判断该对象是否是你所要的。

     Dog dog2=(Dog)animal

    这里你已经强制转换了,可以能存在风险,但是编译可以通过,运行时可能会出现问题,建议使用instanceof判断。

Java入门第二季 升级版

课程升级!以终为始告别枯燥,在开发和重构中体会Java面向对象编程的奥妙

530641 学习 · 6091 问题

查看课程

相似问题