在处理类型的层次结构时,经常想把一个对象不当作它所属的特定类型来对待,而是将其当作基类的对象来对待。这使得人们可以编写出不依赖于特定类型的代码。基类方法的操作都是泛化(generic)的。
这样的代码是不会受添加新类型影响的,而且添加心类型是扩展一个面向对象程序以便处理新情况的最常用方式。这种能力可以极大地改善我们的设计,同时也降低软件维护的代价
泛化的关键在于:当发送泛化方法的消息时,程序员并不想知道是哪一段代码将被执行。
如果不需要知道哪一段代码会被执行,那么当添加心的子类型时,不需要更改调用它的方法,它就能够执行不同的代码。但是问题是编译器uu发精确地了解哪一段代码将会执行,那么它该怎么办呢?
这个问题的答案,也是面向对象程序设计的最重要的妙诀:编译器不可能产生传统意义上的函数调用。为了解决这个问题,面向对象程序设计语言使用了后期绑定的概念。当想对象发送消息时,被调用的代码知道运行时才能确定。
为了执行后期绑定,Java使用一小段特殊的代码来替代绝对地址调用。这段代码使用在对象中存储的信息来计算方法体的地址。Java中,动态绑定是默认行为,不需要添加额外的关键字来实现多态。
下面通过几何形状(Shape)的例子来说明:
void doSomething(Shape shape) {
shape.erase();
//...
shape.draw();
}
这个方法可以与任何Shape对话,因此他是独立于任何要绘制和擦除的对象的具体类型的。
Circel circle = new Circle();
Triangle triangle = new Triangle();
Line line = new Line();
doSomething(circle);
doSomething(triangle);
doSomething(line);
对doSomething的调用会自动地正确处理,而不用管对象的确切类型。当Circle被传入到语气接收Shape的方法中,究竟会发生什么?由于Circle可以被doSomething()看作是Shape,也就是说,doSomething()可以发送给Shape的任何消息,Circle都可以接收,那么,这么做就是完全安全且合乎逻辑的。
doSomething()的代码给人印象深刻之处在于,不知何故,它总是做了该做的。调用Circle的draw()方法所执行的代码与调用Square或是Line的draw()方法所执行的代码是不同的。正是多态才使得事情总是能够被正确处理。编译器和运行系统会处理相关的细节,你需要马上知道的只是事情会发生,更重要的是怎样通过利用它来进行设计。
本文首发自:对象导论笔记-第三天-蜘蛛网间
分享到:
相关推荐
Educoder题目:Java面向对象 - 封装、继承和多态的综合练习答案解析
Educoder题目:Java面向对象 - 封装、继承和多态答案解析
Java ------ 多态作业
Python工具箱.zip - 办公自动化、多态文件搜索、高级加密。Python工具箱.zip - 办公自动化、多态文件搜索、高级加密。Python工具箱.zip - 办公自动化、多态文件搜索、高级加密。Python工具箱.zip - 办公自动化、多态...
第8章--virtual函数与多态
在数据库设计模式中,发现类、第一范式、第二范式和第三范式都是非常重要的概念。这些概念可以帮助开发者设计和实现数据库的结构和行为。 本资源摘要信息对 Java 基础知识点进行了总结,涵盖继承、封装、多态等概念...
Python自学教程-04-代码实现多态.ev4.rar
本讲义“11-面向对象-第3天(接口多态)”深入探讨了面向对象中的两个关键特性:接口和多态。 首先,接口在面向对象编程中扮演着规范和契约的角色。接口定义了一组方法签名,但不包含任何实现。它允许不同的类遵循...
在Java中,多态性(Polymorphism)是面向对象编程的三大特性之一,另外两个是封装和继承。多态性使得代码更加灵活,能够处理不同类型的对象,提高代码的复用性。 在Java中,多态分为类多态和接口多态。类多态主要...
Java基础精品课11-多态录屏5.多态调用演示.mp4
Java编程语言以其强大的功能和广泛的应用而闻名,其中三大特性——封装、继承和多态是其核心概念,对于理解和编写高效、可维护的代码至关重要。 **封装**是面向对象编程的基础,它涉及到将数据(属性)和操作这些...
在Objective-C 2.0程序设计中,多态(Polymorphism)、动态类型(Dynamic Typing)和动态绑定(Dynamic Binding)是面向对象编程的重要概念,它们为代码提供了灵活性和可扩展性。本章主要围绕这三大主题展开,通过一...
purescript-variant, PureScript的多态变体 purescript变体 PureScript的多态变体。安装bower install purescript-variant文档模块文档是发布时的发布。Data.Variant 是PureScr
该方法对强制多态、重载多态、类型参数化多态和包含多态这四种类型的多态进行分析,得出反映类的多态复杂性的量度,即强制多态复杂性(CCPP)、重载复杂性(CMC)、参数多态复杂性(CPMP)、包含多态复杂性(CCTP)...
最后,多态是指对象可以拥有多种形式的能力,例如,一个对象可以是某个类的实例,同时也是某个接口的实例。多态的实现有两种方式:方法重写和方法重载。方法重写是指子类中提供了一个与父类同名、同参数列表的方法,...
多态是面向对象的三大特性(封装、继承、多态)之一,它允许我们使用一个接口或父类引用来调用子类的方法,使得代码更加灵活且易于扩展。PHP5支持两种类型的多态: 1. **方法重写(Method Overriding)**:子类可以...
里面的内容为: 第1关:什么是封装,如何使用封装 ...第3关:super关键字的使用 第4关:方法的重写与重载 第5关:抽象类 第6关:final关键字的理解与使用 第7关:接口 第8关:什么是多态,怎么使用多态
它帮助学习者理解如何定义类、创建对象、使用继承来构建类的层次结构,以及如何通过多态来实现代码的灵活性和可扩展性。此外,还强调了异常处理的重要性,确保程序在遇到错误输入时能正常运行。