类型转换中的编译错误与运行错误

在继承关系中子类向基类的类型转换可以是隐式的类型转换。例如:(假设Employee类继承于Person类,Monkey类是单独一个类) 
Person p = new Employee(); 
如果Employee不是Person的子类,将发生编译时错误,编译器无法进行类型转换。

而基类向子类的类型转换则需要使用显式的类型转换。例如: 
Person p = new Employee(); 
Employee e = (Employee)p; 
如果p的编译时类型不是Employee的基类,将发生编译时错误,如果p的运行时类型不是Employee类或者Employee类的子类,将发生运行时错误。 例如: 
Monkey m = new Monkey(); 
Employee e = (Employee)m; // 编译错误 
Person p = new person(); 
Employee e = (Employee)p; // 运行错误

由于任何类都继承了Object类,因此编译角度来讲任何类都可以向上转型为Object类,再向下转型为另一个类。(假设Person和Monkey没有继承关系),例如: 
Monkey m = new Monkey(); 
Object o = m; 
Person p = (Person)o; 
这种情况下编译没有问题,但是会发生运行时错误(因为Monkey不是Person类或其子类)。如果去掉Object的中间对象,代码可简写为: 
Monkey m = new Monkey(); 
Person p = (Person)(Object)m; 
其中对m向Object的强制类型转换不可或缺,否则将发生编译时错误(除非有Monkey到Person的自定义隐式类型转换),虽然这是一种隐式类型转换。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值