如何理解和应用Java的多态

“一石二鸟。”
――《成语》
 
多态在现实世界中比比皆是。从描述人的性格和行为的“多面人”、“多面手”,到具有综合功能的产品“三合一”、“四合一”,都指动态性特征。多态使我们的世界更绚丽多彩。计算机的应用应该是多态的最典型实例。
多态性是面向对象编程三个重要特性之一。 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 小节专门讨论方法绑定问题。(待续)
 

你可能感兴趣的:(java,覆盖,override,多态,Polymorphism)