您的位置:首页 > 编程语言 > Java开发

如何理解和应用Java的多态 推荐

2009-07-09 11:30 543 查看
[align=center]“一石二鸟。”[/align]
——《成语》

多态在现实世界中比比皆是。从描述人的性格和行为的“多面人”、“多面手”,到具有综合功能的产品“三合一”、“四合一”,都指动态性特征。多态使我们的世界更绚丽多彩。计算机的应用应该是多态的最典型实例。
多态性是面向对象编程三个重要特性之一。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 小节专门讨论方法绑定问题。(待续)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息