- 这里所说的类型转换,是指的是存在继承关系的对象,不是任意类型的对象。当对不存在继承关系的对象进行强制对象类型转换时,java运行时会java.lang.ClassCastEzception异常。
- 在继承链中,我们将子类向父类转换称为“向上转型”,将父类向子类转换称为“向下转型”。
- 不能直接将父类的对象强制转换为子类类型,只能将向上转型后的子类对象再次转换为子类类型。也就是说,子类对象必须向上转型后,才能再向下转型。请看下面的代码:
package qaq;
public class test1 {
public static void main(String[]args){
FatherClass fatherObj = new FatherClass();
SonClass sonObj = new SonClass();
// SonClass sonObj1 = (SonClass)fatherObj;不能将父类对象直接替换为自类对象会抛出异常
fatherObj = sonObj;//先向上转型,再向下转型
SonClass sonObj1 = (SonClass)fatherObj;
}
}
class FatherClass{}
class SonClass extends FatherClass{}
//将第9行的注释去掉,运行时会抛出异常,但是编译可以通过。
因为向下转型存在风险,所以在接收到父类的一个引用时,请务必使用 instanceof 运算符来判断该对象是否是你所要的子类,请看下面的代码:
package qaq;
public class test1 {
public static void main(String[]args){
FatherClass fatherObj = new FatherClass();
SonClass sonObj = new SonClass();
if(fatherObj instanceof SonClass){ //fatherObj 是不是 SonClass 类的实例
SonClass sonObj1 = (SonClass)fatherObj;//判断是,将fatherObj转换为子类对象
}else{
System.out.println("sonObj1没有先向上转型,所以不能转换");
}
fatherObj = sonObj;//向上转型
if(fatherObj instanceof SonClass){//fatherObj 是不是 SonClass 类的实例
SonClass sonObj2 = (SonClass)fatherObj;//判断是,将fatherObj转换为子类对象
}else{
System.out.println("不能转换");
}
}
}
class FatherClass{}
class SonClass extends FatherClass{}
运行结果:sonObj1没有先向上转型,所以不能转换
总结:对象的类型转换在程序运行时检查,向上转型会自动进行,向下转型的对象必须是当前引用类型的子类。