多态的转型分两种:向上转型和向下转型
(1)向上转型:多态本身就是向上转型过的过程
使用格式:父类类型 变量名=new 子类类型();
适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。
例如:
class Person1{
public void print(){
System.out.println("我是一个正常人");
}
}
class TestSuperMan extends Person1{
public void spit(){
System.out.println("喷火");
}
public void fly(){
System.out.println("会飞");
}
}
public class SuperMan {
public static void main(String[] args) {
Person1 p1 = new TestSuperMan();
p1.print();
}
}
当使用Person1类型去实例化TestSuperMan类的时候,就是向上转型;
(2)向下转型
一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型
使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
例如接着上面的代码:
public class SuperMan {
public static void main(String[] args) {
TestSuperMan p2 = (TestSuperMan) p1;
p2.fly();
p2.spit();
}
}
(3)向下转型的安全性问题
需要注意的是,当向下转型时,必须先向上转型,否则会报错:
Exception in thread “main” java.lang.ClassCastException
即类型不能相互转换异常。
此时我们可以引入 instanceof 的概念:
写法是 :实例名 instanceof 类名
例如:
System.out.println(p1 instanceof TestSuperMan);//true
以上结果为true。
instanceof的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。
所以在之后的编程中,如果遇到向下转型的需求前,可先使用instanceof进行判断,来避免发生的转型错误;
如:
if(p1 instanceof TestSuperMan){
System.out.println("---战争时期---");
TestSuperMan p2 = (TestSuperMan) p1;
p2.fly();
p2.spit();
}



