有使用我们需要把子类转换成父类,父类的引用指向子类对象,然后父类的引用再来调用子类重写的方法,已到达多态的效果。
当然,子类中有父类中没有的属性和方法,当我们要调用子类独有的属性和方法是,需要再次转换成子类的引用。
子类向父类转换称为“向上转型”,父类向子类转换称为“向下转型”,向上转型是自动进行的,向下转型要强制类型转换。
要注意的是:只有先向上转型之后,才能向下转型。父类对象不能直接转换成子类对象,编译器不会报错,但是运行时会抛出java.lang.ClassCastException异常
为了避免误操作 向下转型之前先用instanceof运算符判断,这个父类的引用引用的是不是子类的对象。
package learnAgain;
public class SuperToSon
{
static SuperToSon superToSon=new SuperToSon();
public static void main(String[] args)
{
Person person=superToSon.new Person();
/*
不能直接将父类的对象强制转换为子类类型,子类对象必须先向上转型后,才能再向下转型。
*/
// Male male1=(Male)person;//java.lang.ClassCastException:
if(person instanceof Male)//只有父类的引用指向了子类,也就是先向上转型之后
{
Male male1=(Male)person;//才可以再次转换成子类
System.out.println("向下转型成功!");
}
else
System.out.println("请先向上转型");
Male male=superToSon.new Male();
person=male;//向上转型:子类向父类转换,自动进行
if(person instanceof Male)
{
male=(Male)person;//向下转型:父类向子类转换,要显示强制类型转换
System.out.println("向下转成功");
}
else
System.out.println("请先向上转型");
}
class Person{}
class Male extends Person{}
class Animal{}
}
结果:
请先向上转型
向下转成功