当前课程知识点:Java程序设计 >  第四章 接口与多态 >  4.3-多态的概念 >  多态的概念

返回《Java程序设计》慕课在线视频课程列表

多态的概念在线视频

多态的概念

下一节:多态的应用举例

返回《Java程序设计》慕课在线视频列表

多态的概念课程教案、知识点、字幕

大家好

欢迎回来继续学习

JAVA语言程序设计

这一节我们来学习多态的概念

什么是多态呢

用一句最简单的

当然不太严格的话来讲呢

多态指的就是

不同类型的对象

它可以响应相同的消息

而各自对于这个消息的响应行为呢

又是可以是不同的

我们可以超类的对象

和从相同的超类

派生出来的多个子类的对象

都是可以被当作同一种类型对象

来对待的

因为子类的对象

总是可以充当超类的对象来用的嘛

还有实现同一个接口的

不同类型的对象

也可以被称作同一种类型的对象来对待

当成这个接口类型来对待

这个时候就可以向

这些不同类型的对象

发送同样的消息

由于多态性

这些不同类的对象

它响应同一个消息的时候的行为

却可以是有所差别的

比如说所有的Object类的对象

都可以响应toString这个消息

那么所有的BankAccount类型的对象

都可以响应deposit这个消息

但是各自它们响应的时候的行为

可以不一样

因为每个类有自己

对从超类继承来的方法的一个覆盖

它每个类可以自己覆盖不同的方法体

使用多态性的目的是什么呢

首先它可以使程序看起来更加简单

更容易理解

而且可以使程序的可扩展性更好

现在我们来看一下这个例子

这是一个图形类的例子

我们看这个继承关系图

最上层的这个超类Shape类里面呢

声明了一个绘图方法draw

还有一个erase方法擦除方法

然后它的子类圆circle

正方形square

和三角形triangle

每个类都自己又重写了

叫做覆盖了draw和erase方法

那么这以后呢

我们要绘图的时候

可以去构造一个子类对象

比如说我们构造一个circle

圆类的对象

将这个圆类的对象引用

去初始化或者赋值给

它超类的引用

比如说赋值给s

然后通过超类的引用

去调用draw方法

那实际上会画出一个什么图形呢

当然会准确的画出一个子类的图形

因为它会调用子类中

覆盖的这个方法体

为了理解为什么会发生

这种多态的现象呢

我们首先要来理解

这个绑定的概念

什么是绑定呢

绑定就是将一个方法调用表达式

与方法体的代码结合起来

这个过程叫做绑定

根据绑定的时期不同呢

可以将绑定分为早绑定和晚绑定

早绑定指的是

在程序运行之前

就完成了这个绑定的执行

一般来讲就是在编译时候

发生的绑定

那么晚绑定呢

也叫动态绑定

或叫运行时期的绑定

就是在程序运行的时候

基于对象的类别

去绑定它应该执行的方法体

现在我们以这个绘图为例

在这个例子中

我们把所有的类

都放在这个binding这个包里面

我们来看这个超类Shape

实际上它只是建立了一个

通用的接口

就是对外服务的通用接口

因为这里面的draw方法和erase方法呢

都是空方法体

当然了因为没有一个确定的

它是什么类型

它只是一个Shape

也没办法实现这个绘图和擦除

那接下来我们就来看

具体的子类

就覆盖了draw方法和erase方法

比如说这个圆类

它继承了Shape类

圆是一个具体的类型

当然它可以实现它的绘图方法

这里我们进行一下简化

简单的就输出一行信息

来代表它以自己的独特的具体方式

实现了draw方法

这个erase方法也是这样的

在圆类中有自己的具体实现

再看这个square类方形类

同样继承了Shape

然后实现了自己的绘图和擦除方法

Triangle三角形类也是这样

接下来我们就测试一下

这个动态绑定

在这个bindingTester类里面呢

我们看main方法中

构造了一个Shape数组

那么这个数组的每个元素

都是一个Shape对象的引用

在构造这个数组的时候

对象还没有呢

那接下来呢

我们用什么办法来生成对象呢

大家看这个for循环里面

在这个for循环中呢

我们用随机数方法

来随机生成各种图形

我们用这个random方法

得到一个随机数以后呢

要把它转换成0到2之间的整数

然后我们用转换好的这个数呢

作为switch case语句的case标号

这样的话呢

我们每一轮循环呢

就会随机的进入一个case分支

也就是在每一轮循环中

随机构造了某种图形的一个对象

所以接下来我们来绘制

所有这些图形

那这个时候我们是不知道

在每次运行的时候

这个Shape数组s里面

到底有哪些类型的对象

所以我们能做的只是按照统一的

对外接口

对每一个对象去调用draw方法

那这个时候我们能看到

绘出来的图形都是个性化的图形

我们来看这个运行结果

这是某一次的运行结果

当然你再运行它

你可能得到不同的图形序列

因为每一次产生哪些图形都是随机的

那么这样就说明这些方法体的调用

绝对不是在编译的时候确定的

因为编译的时候

是不能做类型识别的

动态类型识别

那么肯定是在运行时才确定的

也就是说我们通过这个例子

让大家能够体会到

这是一个动态绑定的过程

这一节呢介绍了多态性的概念和语法

多态性的技术基础

一个是动态绑定技术

一个是向上转型技术

Java程序设计课程列表:

第一章 Java语言基础知识

-1.0-导学

--1.0-导学

--JDK的安装与配置01

--JDK的安装与配置02

--JDK的安装与配置03

--编辑并执行第一个java程序01

--编辑并执行第一个java程序02

--编辑并执行第一个java程序03

--eclipse的安装和配置01

--eclipse的安装和配置02

--eclipse的安装和配置03

--使用eclipse进行Java的开发01

--使用eclipse进行Java的开发02

--使用eclipse进行Java的开发03

-1.1-Java与面向对象程序设计简介

--1.1.1 Java与面向对象程序设计简介

--第一章 Java语言基础知识--1.1-Java与面向对象程序设计简介

-1.2-基本数据类型与表达式

--1.2.1-基本数据类型与表达式

-第一章 Java语言基础知识--1.2-基本数据类型与表达式

-1.3-数组

--1.3.1-数组

-第一章 Java语言基础知识--1.3-数组

-1.4-算法的流程控制

--1.4.1-算法的流程控制

--第一章 Java语言基础知识--1.4-算法的流程控制

-1.5-第一章小结

--1.5.1-第一章小结

-第一章编程练习题

-课件

--外部链接

第一章续-习题讲解视频

-Java环境配置、Eclipse使用、Helloworld程序详解

--JAVA的安装和配置

--编写并执行第一个Java程序及Java的跨平台性

--eclipse的安装和配置

--使用eclipse建立Java项目、编写和运行Java程序

--Java注释和Eclipse中的注释操作

--详解HelloWorld程序

-Java数据类型

--Java数据类型介绍

--Java整数类型

--Java浮点类型

--Java字符类型和布尔类型

--数据类型实战

--数据类型转换

--Java强制类型转换精度损失示例与表达式中的数据类型转换

-Java数组

--Java数组介绍、声明与使用

--一维数组的初始化与length属性

--数组索引的原理与使用

--二维数组的介绍与使用

-Java变量

--Java的变量

-命令行参数

--命令行参数的介绍

第二章 类与对象

-2.0-导学

--2.0-导学

-2.1-面向对象方法的特性

--2.1-面向对象方法的特性

--第二章 类与对象--2.1-面向对象方法的特性

-2.2-1-类声明与对象创建

--2.2-1-类声明与对象创建

--第二章 类与对象--2.2-1-类声明与对象创建

-2.2-2-数据成员

--2.2-2-数据成员

--第二章 类与对象--2.2-2-数据成员

-2.2-3-方法成员

--2.2-3-方法成员

--第二章 类与对象--2.2-3-方法成员

-2.2-4-包

--2.2-4-包

--第二章 类与对象--2.2-4-包

-2.2-5-类的访问权限控制

--2.2-5-类的访问权限控制

--第二章 类与对象--2.2-5-类的访问权限控制

-2.3-1-对象初始化

--2.3-1-对象初始化

--第二章 类与对象--2.3-1-对象初始化

-2.3-2-内存回收

--2.3-2-内存回收

--第二章 类与对象--2.3-2-内存回收

-2.4-枚举类

--2.4-枚举类

--第二章 类与对象--2.4-枚举类

-2.5-应用举例

--2.5-应用举例

-2.6-第2章小结

--2.6-第2章小结

-第二章编程练习题

-课件

--第二章课件

第三章 类的重用

-3.0-导学

--3.0-导学

-3.1.1-3.1.2-类继承的概念和语法

--3.1.1-3.1.2-类继承的概念和语法

--第三章 类的重用--3.1.1-3.1.2-类继承的概念和语法

-3.1.3-隐藏和覆盖

--3.1.3-隐藏和覆盖

--第三章 类的重用--3.1.3-隐藏和覆盖

-3.2-Object 类

--3.2-Object 类

--第三章 类的重用--3.2-Object 类

-3.3-终结类与终结方法

--3.3-终结类与终结方法

--第三章 类的重用--3.3-终结类与终结方法

-3.4-抽象类

--3.4-抽象类

--第三章 类的重用--3.4-抽象类

-3.5-泛型

--3.5-泛型

--第三章 类的重用--3.5-泛型

-3.6-类的组合

--3.6-类的组合

-3.7-小结

--3.7-小结

-第三章编程练习题

-课件

--课件

第四章 接口与多态

-4.0-导学

--导学

-4.1-接口

--接口

--第四章 接口与多态--4.1-接口

-4.2.1-4.2.2-类型转换

--类型转换

--第四章 接口与多态--4.2.1-4.2.2-类型转换

-4.2.3-方法的查找

--方法的查找

--第四章 接口与多态--4.2.3-方法的查找

-4.3-多态的概念

--多态的概念

--第四章 接口与多态--4.3-多态的概念

-4.4-多态的应用举例

--多态的应用举例

--第四章 接口与多态--4.4-多态的应用举例

-4.5-构造方法与多态性

--构造方法和多态性

--第四章 接口与多态--4.5-构造方法与多态性

-4.6-本章小结

--本章小结

-第四章编程作业

-课件

--课件

第五章 输入输出

-5.0-导学

--5.0-导学

-5.1.1-5.1.2-异常处理的概念

--5.1.1-5.1.2-异常处理的概念

--第五章 输入输出--5.1.1-5.1.2-异常处理的概念

-5.1.3-5.1.5-异常的处理

--5.1.3-5.1.5-异常的处理

--第五章 输入输出--5.1.3-5.1.5-异常的处理

-5.2-输入输出流的概念

--输入输出流的概念

--第五章 输入输出--5.2-输入输出流的概念

-5.3.1-写文本文件

--写文本文件

--第五章 输入输出--5.3.1-写文本文件

-5.3.2-读文本文件

--读文本文件

--第五章 输入输出--5.3.2-读文本文件

-5.3.3-写二进制文件

--写二进制文件

--第五章 输入输出--5.3.3-写二进制文件

-5.3.4-读二进制文件

--读二进制文件

-5.3.5-File类

--File类

-5.3.6-处理压缩文件

--处理压缩文件

-5.3.7-对象序列化

--对象序列化

-5.3.8-随机文件读写

--随机文件读写

-5.4-本章小结

--本章小结

-课件

--课件

第六章 对象群体的组织

-6.0-导学

--导学

-6.1-Java集合框架介绍

--Java集合框架介绍

--第六章 对象群体的组织--6.1-Java集合框架介绍

-6.2-主要接口及常用的实现类

--6.2-主要接口及常用的实现类

--第六章 对象群体的组织--6.2-主要接口及常用的实现类

-6.3-常用算法

--常用算法

-6.4-数组实用方法

--6.4-数组实用方法

-6.5-基于动态数组的类型(Vector, ArrayList)

--基于动态数组的类型(Vector, ArrayList)

-6.6-遍历Collection

--遍历Collection

-6.7-Map接口及其实现

--Map接口及其实现

-6.8-第6章小结

--第6章小结

-课件

--课件

第七章 图形用户界面

-7.0-导学

--导学

-7.1-绘图

--绘图

-7.2-Swing基础

--Swing基础

-7.3-Swing的层次

--Swing的层次

-7.4-布局管理

--布局管理

-7.5-内部类

--内部类

-7.6-事件处理的基本概念

--事件处理的基本概念

-7.7-事件派发机制

--事件派发机制

-7.8-顶层容器

--7.8-顶层容器

-7.9-中间层容器(一)

--7.9-中间层容器(一)

-7.10-中间层容器(二)

--7.10-中间层容器(二)

-7.11-原子组件(一)

--7.11-原子组件(一)

-7.12-原子组件(二)

--7.12-原子组件(二)

-7.13-原子组件(三)

--7.13-原子组件(三)

-7.14-其它Swing特性

--7.14-其它Swing特性

-7.15-第7章小结

--7.15-第7章小结

-课件

--课件

多态的概念笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。