如何理解和应用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  小节专门讨论方法绑定问题。(待续)




















本文转自高永强51CTO博客,原文链接: http://blog.51cto.com/yqgao/175659  ,如需转载请自行联系原作者

相关文章
|
3天前
|
Java 编译器
Java——类与对象(继承和多态)
本文介绍了面向对象编程中的继承概念,包括如何避免重复代码、构造方法的调用规则、成员变量的访问以及权限修饰符的使用。文中详细解释了继承与组合的区别,并探讨了多态的概念,包括向上转型、向下转型和方法的重写。此外,还讨论了静态绑定和动态绑定的区别,以及多态带来的优势和弊端。
18 9
Java——类与对象(继承和多态)
|
8天前
|
Java 数据库连接 数据库
Java服务提供接口(SPI)的设计与应用剖析
Java SPI提供了一种优雅的服务扩展和动态加载机制,使得Java应用程序可以轻松地扩展功能和替换组件。通过合理的设计与应用,SPI可以大大增强Java应用的灵活性和可扩展性。
39 18
|
6天前
|
缓存 监控 Java
Java中的并发编程:理解并应用线程池
在Java的并发编程中,线程池是提高应用程序性能的关键工具。本文将深入探讨如何有效利用线程池来管理资源、提升效率和简化代码结构。我们将从基础概念出发,逐步介绍线程池的配置、使用场景以及最佳实践,帮助开发者更好地掌握并发编程的核心技巧。
|
3天前
|
SQL JavaScript 前端开发
用Java来开发Hive应用
用Java来开发Hive应用
18 7
|
3天前
|
SQL JavaScript 前端开发
用Java、Python来开发Hive应用
用Java、Python来开发Hive应用
18 6
|
3天前
|
Java 数据库连接 开发者
Java中的异常处理机制:理解与应用
在Java编程中,异常处理是一个核心概念,它允许程序在遇到错误时优雅地恢复或终止。本文将深入探讨Java的异常处理机制,包括异常的分类、如何正确使用try-catch-finally块以及throw关键字。我们将通过实例来说明如何在Java应用程序中有效地捕获和处理异常,以确保程序的健壮性和稳定性。
|
3天前
|
Java 调度 开发者
Java中的多线程基础及其应用
【9月更文挑战第13天】本文将深入探讨Java中的多线程概念,从基本理论到实际应用,带你一步步了解如何有效使用多线程来提升程序的性能。我们将通过实际代码示例,展示如何在Java中创建和管理线程,以及如何利用线程池优化资源管理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧,帮助你更好地理解和应用多线程编程。
|
4天前
|
存储 负载均衡 Java
Jetty技术深度解析及其在Java中的实战应用
【9月更文挑战第3天】Jetty,作为一款开源的、轻量级、高性能的Java Web服务器和Servlet容器,自1995年问世以来,凭借其卓越的性能、灵活的配置和丰富的扩展功能,在Java Web应用开发中占据了举足轻重的地位。本文将详细介绍Jetty的背景、核心功能点以及在Java中的实战应用,帮助开发者更好地理解和利用Jetty构建高效、可靠的Web服务。
16 2
|
8天前
|
Java 数据处理
技术分享:高效与灵活并存——Java版通用树形结构转换工具的实现与应用
在软件开发中,树形结构的数据表现形式无处不在,从文件系统的目录树到组织架构的部门树,再到各类产品的分类结构。处理这些具有层级关系的数据时,将其转换为树形结构以便展示和操作显得尤为重要。Java作为一门成熟的编程语言,虽然提供了强大的集合框架,但并未直接提供树形结构转换的内置工具。因此,开发一个高效且灵活的通用树形结构转换工具成为许多项目中的必备需求。
15 2
|
13天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。