“一石二鸟。”
——《成语》
多态在现实世界中比比皆是。从描述人的性格和行为的“多面人”、“多面手”,到具有综合功能的产品“三合一”、“四合一”,都指动态性特征。多态使我们的世界更绚丽多彩。计算机的应用应该是多态的最典型实例。
多态性是面向对象编程三个重要特性之一。
Java
中的多态性是通过综合应用继承、覆盖,以及向上转型实现的。本章首先综合阐述面向对象编程的这些重要特征,引申到代码中的多态概念、多态带来的好处,以及多态能够解决的问题。然后通过实例详细讨论多态技术在编程中的应用。
8.1 概述
不具备多态性的计算机语言不能算是功能强大、动态绑定的语言。
Java
实际上将
C/C++
语言中的多态编程技术简单化、规范化,以及实用化。使之更容易解决应用软件开发中的问题。例如,
Java
取消了
C/C++
中体现多态技术但没有多大实用价值的操作符重载;摒弃了
C/C++
中实现多态时,对超类必须定义虚拟成员子程序的要求等等,这些改进无疑使
Java
成为当今最流行语言起到推波助澜的作用。
当然,多态编程不是单一概念和技术的应用。例如,为了实现多态,在继承中对超类提供多态接口的要求,对子类覆盖超类方法或完善多态接口,由此产生多态方法的规定,以及动态调用这些方法涉及的编程技术,要求读者朋友需要花费更多的注意力、时间和练习,以便掌握多态编程技术。
下面让我们回到问题的开始,一步步做起。首先讨论多态能解决什么问题?它的应用给软件开发带来什么好处?
8.1.1 多态问题
讨论以下几个应用软件开发中涉及多态性的问题。
问题
1
:某信用卡公司要给成千上万的客户发账户信息。每个客户是不同对象。如何用最有效的手段编写代码?
回答:使发送客户信息的操作,如
sentMessage()
具有多态性。对不同的对象,即客户,虽然都调用方法
sentMessage()
,但对象不同,其操作内容不同。利用多态、链表或集合,以及循环,可以有效地解决这个问题。
问题
2
:定义键盘新功能。例如,根据不同国家语言输入,货币键“
$
”在中文输入时自动切换为“¥”;在意大利文输入时为“
₤
”;在法文输入时为“
₣
”,并且分别代表各国货币的表示方式。如何在代码中有效地实现这些功能?
回答:应用多态,对货币键进行新的定义。如不同国家代表不同对象,而监控货币键的操作由方法,如
currencyKey()
,执行不同货币符的显示。其他与货币相关的键也如法炮制,举一反三。
问题
3
:回到在上一章节讨论过的计算几何物体表面积和体积的例子。如何在程序中最有效地计算众多不同几何体的表面积
computeArea()
?
回答:这是解释多态性最经典例子。计算表面积的方法,如
computeArea()
,包括其他类似方法,如
computeVolume()
,
draw()
,等等,都可应用多态来解决。因为这些方法都可以针对不同的几何体,进行运算和操作。即:形态不一、方法相同、内容多样。
读者朋友是否也可以也列举出更多多态方面的问题?
8.1.2 多态好处
多态给我们带来的好处,可以归纳为如下
5
点:
1.
可替换性(
substitutability
)。多态对已存在代码具有可替换性。例如,多态对圆
Circle
类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.
可扩充性(
extensibility
)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.
接口性(
interface-ability
)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。例如,假设超类
Shape
规定了
两个实现多态的接口方法,
computeArea()
以及
computeVolume()
。子类,如
Circle
和
Sphere
为了实现多态,可以完善或者覆盖这两个接口方法。
4.
灵活性(
flexibility
)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.
简化性(
simplicity
)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
值得注意的是,多态并不能够解决提高执行速度的问题,因为它基于动态装载和地址引用,或称动态绑定。但在
Java
中,除了
final
类和一定条件下的
final
方法外,所有方法都由
JVM
在运行期间进行动态绑定。将在
8.4
小节专门讨论方法绑定问题。(待续)
本文转自高永强51CTO博客,原文链接:
http://blog.51cto.com/yqgao/175659
,如需转载请自行联系原作者