百度看到的,觉得总结的很全面,记录一下
原文地址:https://baijiahao.baidu.com/s?id=1617076999224722021&wfr=spider&for=pc
基本数据类型的转换暂不讨论
1.在引用数据类型中,只有有继承关系的类型才能进行类型转换;
也就是在一条继承链上的
2.类型转换只是转换看待对象的引用的类型,对象本身没有也不可能参与转换;
引用的指向,引用具体代表哪一个类型 对象还是那个对象
3.父类引用可以自动指向子类对象,但只能访问和调用到来自于父类的属性和行为;
就是父子类共有的部分
4.子类的引用不能指向父类或其它子类对象,就算强转也会导致运行失败并抛出ClassCastException;
编译可以通过,运行时会报错。换句话说就是父类或其他子类对象无法强制转换为当前子类对象。
例如:父类是宠物类Pets 子类Dog和Cat都继承宠物类
我们无法将宠物类型或猫类型强制转为狗类型
Pets p=new Pets();
Dog d=(Dog)p;
运行时会报错
或
Cat c=new Cat();
Dog d=(Dog)c;
编译期报错
Pets p=new Dog();//子类引用自动赋给父类引用,没有问题。属于向上转型,不过会丢失部分信息,此时只能调用宠物类和狗类都有的属性和方法
Dog d=(Dog)p;//强制类型转换,向下转型,不安全;不过如果成功,就会具有狗类的所有属性和方法信息。
不安全的原因是宠物类的引用可能指向其他子类比如猫类
Pets p=new Cat();
Dog d=(Dog)p;//编译器没有任何问题;运行时进行类型信息绑定得知p指向猫类会报运行时异常
为了防止这种情况,可以在强制转型时进行类型检查
if(p instanceof Dog){
Dog d=(Dog)p;
}
5.把父类引用赋给子类引用,语法上必须使用强制类型转换,要想运行也成功还必须保证父类引用指向的对象一定是该子类对象(最好使用instanceof判断后,再强转)。