为了账号安全,请及时绑定邮箱和手机立即绑定

java中引用类型的强制转换

java中引用类型的强制转换

qq_阳光下的海风_0 2016-09-08 19:45:41
public class TestPerson { public static void main(String[] args) { // 向上类型转换,正常运行 Animal a = new Cat(); a.show(); // 向下类型转换,正常运行 Animal cat = new Cat(); Cat cat2 = (Cat) cat; cat2.show(); // 运行时异常 Cat cat3 = (Cat) new Animal(); cat3.show(); // 正常运行 Cat cat4 = (Cat) getAnimal(a); cat4.show(); // 运行异常 Cat cat5 = (Cat) getAnimal(); cat4.show(); } public static Animal getAnimal(Animal a) { return a; } public static Animal getAnimal() { return new Animal(); } } class Animal { public void show() { System.out.println("Animal"); } } class Cat extends Animal { public void show() { System.out.println("Cat"); } }我的疑惑是:明明都是强制转换,为什么有的会报异常,有的却可以正常进行?主要是异常的部分。注:我能理解向上类型转换以及向下类型转换正常运行的代码,只是不理解那些异常的代码。请大神讲解,感激不尽
查看完整描述

5 回答

已采纳
?
dky

TA贡献93条经验 获得超26个赞

强制类型转换的前提是,   对象本身的类型就是你要转换的类型,但是在java中,继承和多态的特性让我们在定义函数的参数和返回值的时候往往是定义其父类,比如说,什么肤色的人都能坐飞机,你在飞机上随机挑选一个乘客,你说这个乘客是黑人,这个命题事件成立的前提是这个人本身就是黑人,

查看完整回答
反对 回复 2016-09-08
  • qq_阳光下的海风_0
    qq_阳光下的海风_0
    主要是和Android中的findViewByid()混了,这个函数返回值就是View,就直接强转了,、、、、这个函数底层应该做了相应的处理的。
  • dky
    dky
    是这样的,哥们, findview的时候, 其实你是实现在xml文件中写好了这个控件的类型,只不过,所有控件的都是拓展字view,和我说的一个意思 , findviewbyid函数就是通过id去找控件,找到的控件是什么,函数不知道 ,但是使用者在xml文件中写了什么,使用者自己知道 , 就有了对应的强转 。和我之前说的一个意思 。
  • qq_阳光下的海风_0
    qq_阳光下的海风_0
    嗯嗯,理解差不多了,谢啦
?
qq_碎流_0

TA贡献3条经验 获得超1个赞

强制类型转换的前提: 你明确知道这个类就是你要的那个类型,只不过被父类替代了.而如果你没有明确这个类是子类,你还要去强制类型转换,这个是不行的.

查看完整回答
1 反对 回复 2016-09-09
?
qq_碎流_0

TA贡献3条经验 获得超1个赞

强制类型转换的前提: 你明确知道这个类就是你要的那个类型,只不过被父类替代了.而如果你没有明确这个类是子类,你还要去强制类型转换,这个是不行的.

查看完整回答
反对 回复 2016-09-09
?
scala_somnus_gxy

TA贡献23条经验 获得超5个赞

你的运行异常都是因为你直接用子类去创建父类的一个引用,按正常逻辑想想都不对啊,就像生孩子似的,父亲可以生出好几个孩子,你能倒过来说孩子生出好几个父亲?????

查看完整回答
反对 回复 2016-09-09
  • 5 回答
  • 0 关注
  • 1797 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信