三十、多态性、动态类型 和 动态绑定(三)运行时 VS 编译时

因为  id类型变量中存储的物件类型  在编译的时候  是  不确定的,所以  某些检查  会被推迟  到程序执行的时候。先  思考一下  下面两行语句:

其中  物件fractionOne  属于  Fraction类型,用来代表  比例,而  setReal:andImaginary:这项措施  是  用来设定  一个复数所包含的实数  和  虚数的值的,只能  针对  代表复数的Complex类型的物件  实施。于是  当编译器  遇到  上面两行语句时,就会发出  这样的警告:

它的意思  是  Fraction类型的物件  可能无法对  -setReal:andImaginary:这项措施  作出  反应,也可以理解为  无法对  Fraction类型的物件  采取  -setReal:andImaginary:这项措施。由于  编译器  知道  变量fractionOne  存储着  Fraction类型的物件,所以  在编译的时候  编译器  就能发现  这个问题。

再  思考一下  下面两行语句:

当编译器  遇到  这两行语句时,就不会发出  任何警告了,因为  编译器  不知道  变量fractionOne当中  会存储  什么类型的物件。但是  在程序  运行的时候,才会出现  错误信息:

程序  运行的时候,运行系统  会检查  变量fractionOne中的物件  属于  什么类型。经过  检查,运行系统  发现  变量fractionOne中的物件  属于  Fraction类型,于是  运行系统  又  检查  setReal:andImaginary:这项措施  是否属于  Fraction这类物件。由于  setReal:andImaginary:这项措施  属于  Complex这类物件,而  不是  Fraction这类物件,所以  就产生了  上述的错误信息。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值