如果不适用子类中的特有方法,只是使用父类中的方法,则用向上转型。
如果要用子类中的特有方法,那我们只能用向下转型。
体现:
父类的引用指向了子类的对象
Dog d=new Dog();//Dog对象的类型就是Dog类型。
Animal a=new Dog();//右边是Dog类型,左边是Animal类型。
好处:
提高了程序的扩展性。
弊端:
通过父类引用子类对象,只能引用父类中已经有的方法,不能引用子类的方法。
前提:
1、必须有关系:继承、实现。
2、通常都有重写的操作。
子类对象特有的方法,如何在多态中实现?
Animal a =new Dog();//Animal是父类型,new Dog()是子类型。但是父类型的引用指向子类型的时候,这就让子类对象进行了类型的提升(向上转型)。
向上转型的好处:提高了扩展性,隐藏了了子类型。弊端:不能引用子类的方法。如果想要使用子类的方法,只能向下转型。
Animal a=new Dog();
a.eat();
Dog d=(Dog)a;----向下转型
d.lookHome()
当需要子类对象特有的内容的时候,我们可以使用向下转型。无论向上还是向下都是子类对象做着转型(new 对象)。
向下转型必须注意的事项:
Animal a=new dog();
Cat c=(Cat) a;向下转型因为不明确具体的子类型,所以容易引发ClassCastException异常。所以为了避免这个问题,需要在向下转型前,做类型的判断。
判断类型有关键字 instanceof
If(a instanceof cat ){
Cat c=(Cat)a;
c.catchMouse();
}
Else if (a insance dog){
Dog d =(Dog) D;
d.lookhome();
}