多形性(多态)

按照中国大陆地区的翻译,这应该叫“多态”,不过站在一个初学者的角度,我更喜欢台湾人“多形性”的译法。因为“多态”这个名词显得过于专业,给人生涩和抽象的感觉,不好理解,而“多形性”这一说法,再加上“正方形、三角形均属于形状的一种”的经典例子,将java的这一特性阐释得简单明了。
按照我的理解,多形性的最大价值也是实现了另一种形式的封装,如果说包实现的是纵向封装(之所以这么说是因为我觉得包只对外提供有限的接口,对于包内的任何实现细节,客户程序都是无需关心的,不管这个细节的实现层次有多深),那么将多形性称之为横向封装应该是比较合适的,因为它将一个总类型(基础类)分解成多个具体的类型(衍生类),对于使用这些类型的客户程序来说,在大多数时候只需要将这多个衍生类当成基础类来使用它们即可,而不必对其进行区分。因为在基础类中声明了每个衍生类都具有的行为(即方法),在每个衍生类中这些行为被重新定义(覆盖)以实现其自己的行为。当我们把衍生类当作基础类来使用的时候,虽然表面上看我们调用的是基础类的方法,但是在运行期间java的方法调用机制会自动去为我们找到我们所使用的衍生类中所对应的方法,这才是真正被执行的方法。这种方法调用机制被称为“动态绑定”,因为具体调用哪个方法是在程序正真运行的时候才知道的,而不是程序被编译的时候就知道了(虽然我们可能知道,但编译器不知道)。
对于具有多形性的类的使用者来说它是如此的简单方便,对于它的维护者来说这样的特性也同样令人赏心悦目,以本文开始的形状例子为例:开始的时候我们只为形状衍生出了正方形和三角形,假设这个时候完全可以满足客户程序的需要,但随着业务的拓展,我们发现,只有正方形和三角形已经无法满足客户程序的需求了,它迫切需要一个圆形。这个时候形状类的维护者只需要再从形状类衍生出一个圆形类即可,由于圆形和形状具有同样的接口,所以客户程序可以像使用其它形状一样来使用圆形,而不会给客户程序带来更多的使用成本。由此可见,多形性具有良好的扩展性。
多形性中涉及到造型(即类型转换)的问题,当我们把一个衍生类当成基础类来使用的时候叫作上溯造型,上溯造型的目的很显然是为了更加方便统一地使用一系列类型。在大多数时候上溯造型都是可以完全满足我们的需求的,但在某些情况下,我们需要使用被上溯造型了的类它本身所独有的方法,即在基础类中没有的方法,这个时候要是还想通过基础类来调用它的独有方法,显然是不行的,因为基础类并没有提供这个接口,所以我们还需要将它转换回具体类型才能调用这个独有方法,这个过程就叫下溯造型。上溯造型是安全的,因为基础类具有的接口,衍生类也保证具有,所以我们把衍生类当作基础类来给它发送消息可以保证这个消息会被接收到而不丢失。但是下溯造型却不是安全的,因为衍生类可能具有基础类不具有的接口,所以我们把基础类当作衍生类来给它发送消息调用相应方法的时候可能被调用的接口是不存在的,所以这个消息可能会丢失掉。这也正是上溯造型不必显示声明,而下溯造型必须显示声明的原因了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值