理解Java中的多态

      多态是面向对象语言的一个重要特征。它是指继承同一父类的不同子类之间(按照某种规则)呈现不同的状态。要想清楚的理解多态的概念,就必须先把前面定义中的“某种规则”搞明白。下面,我就这一规则进行详细分析。
      我先定义一个父类,类名取为A。类A里写一个公共方法f()。然后我再定义两个子类B和C,它们都继承自类A。我再实例化类B为b,类C为c。接着,我先把b赋值给类A的实例a(注1),然后调用a的方法f(),再把c赋值给a,也调用a的方法f()。结果是我们两次调用了类A的方法f()。现在我想,既然类B与类C不同,那么,有没有一种方法,可以使上面对方法f()的调用根据子类的不同而不同?答案是肯定的。我们分别在类B、类C中重新定义方法f(),并且通过一定手段使上面调用方法f()时,调用的实际是子类中的方法f()。这就是所谓的多态。而且,多态是非常有用的。
      Java中在覆盖父类方法的同时,实现了多态中的对父类方法的隐藏;而在c#中,实现这一步则需要virtual跟override关键字来显式实现。在多态中,我们可以把父类中的该方法称为虚方法。抽象方法是函数体为空的虚方法,所以它也符合多态的规则。

 


注1:因为类B继承自类A,类B的实例也同样受类A的约束,所以类B的实例可以赋值给类A的实例,这也符合人的逻辑,是正确的逻辑。
还有一种错误的逻辑,说类B扩展了类A,类B里所包含的东西就比类A中的东西多,也就是说类B可以容纳类A。由此联想int型变量可以赋值给long型或float型变量,反过来则不行,进而得出结论类A的实例可以赋值给类B的实例。(初学时我就是这么想的)要知道,这是错误的逻辑。

 

      如果你有更好的理解,请写出来大家一起分享!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15149306/viewspace-425551/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15149306/viewspace-425551/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值