java多态性的强制转换_有关Java多态性和强制转换的问题

小编典典

考虑一个真实的例子:

public class Dog extends Animal

所有的狗都是动物,但并非所有的动物都是狗。因此…

public class Cat extends Animal

仅在相关动物确实是狗的情况下,才能将动物丢给狗。否则,它将迫使宇宙将狗特有的属性(摇摆的尾巴,吠叫等)推断到动物上。该动物很可能是猫,具有它独特的属性(发出刺耳的声音,严格的自我清洁制度等)。如果无法进行强制转换,则在运行时引发ClassCastException。

没有人想要一只狗发出呼pur声。

((M)k).getClass()给出K。为什么呢?它被铸成更普通的M!

您已将k强制转换为M,但是所有类都有一个getClass()方法。k的类始终为K,无论您对它的引用是否为M。如果您将狗扔给动物,然后问它是什么动物,它仍然会回答它是狗。

实际上,强制转换为超类是多余的。狗已经是动物,它拥有动物的所有方法以及它自己的方法。许多代码分析工具(例如FindBugs)会通知您多余的转换,因此您可以将其删除。

假设我在M和K中都实现了doIt()方法。

((M)k).doIt();

给M或K的doIt()?

K的doIt()的原因与上述相同。强制转换在参考上进行;它不会将对象转换为其他类型。

您能否举一个说明何时投放(Dog doggy =(Dog)myAnimal)有意义的示例?

当然可以。想象一下一种方法,该方法接收要处理的动物列表。所有的狗都需要散步,而所有的猫都需要使用鸟形玩具玩耍。为此,我们调用takeForWalk()仅在Dog上存在的play()方法,或仅在Cat上存在的方法。

public void amuseAnimals( List animals ) {

for ( Animal animal : animals ) {

if ( animal instanceof Dog ) {

Dog doggy = (Dog)animal;

doggy.takeForWalk( new WalkingRoute() );

} else if ( animal instanceof Cat ) {

Cat puss = (Cat)animal;

puss.play( new BirdShapedToy() );

}

}

}

2020-11-13

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值