Cat cat=(Cat)animal;//编译时是按Cat类型,为什么运行时是按Dog类型?
是不是因为在他之上有 Dog dog2=(Dog)animal;这一句,已经把animal转成了Dog类型,所以运行时是按照Dog类型?
是不是因为在他之上有 Dog dog2=(Dog)animal;这一句,已经把animal转成了Dog类型,所以运行时是按照Dog类型?
2015-03-02
在继承中,子类向父类转换称为“向上转型”,将父类向子类转换称为“向下转型”。
很多时候,我们会将变量定义为父类的类型,却引用子类的对象,这个过程就是向上转型。程序运行时通过动态绑定来实现对子类方法的调用,也就是多态性。
然而有些时候为了完成某些父类没有的功能,我们需要将向上转型后的子类对象再转成子类,调用子类的方法,这就是向下转型。
注意:不能直接将父类的对象强制转换为子类类型,只能将向上转型后的子类对象再次转换为子类类型。也就是说,子类对象必须向上转型后,才能再向下转型。
因为向下转型存在风险,所以在接收到父类的一个引用时,请务必使用 instanceof 运算符来判断该对象是否是你所要的。
Dog dog2=(Dog)animal
这里你已经强制转换了,可以能存在风险,但是编译可以通过,运行时可能会出现问题,建议使用instanceof判断。
举报