当前课程知识点:Java程序设计 > 第四章 接口与多态 > 4.3-多态的概念 > 多态的概念
大家好
欢迎回来继续学习
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方法
那这个时候我们能看到
绘出来的图形都是个性化的图形
我们来看这个运行结果
这是某一次的运行结果
当然你再运行它
你可能得到不同的图形序列
因为每一次产生哪些图形都是随机的
那么这样就说明这些方法体的调用
绝对不是在编译的时候确定的
因为编译的时候
是不能做类型识别的
动态类型识别
那么肯定是在运行时才确定的
也就是说我们通过这个例子
让大家能够体会到
这是一个动态绑定的过程
好
这一节呢介绍了多态性的概念和语法
多态性的技术基础
一个是动态绑定技术
一个是向上转型技术
-1.0-导学
--1.0-导学
-1.1-Java与面向对象程序设计简介
--第一章 Java语言基础知识--1.1-Java与面向对象程序设计简介
-1.2-基本数据类型与表达式
-第一章 Java语言基础知识--1.2-基本数据类型与表达式
-1.3-数组
--1.3.1-数组
-第一章 Java语言基础知识--1.3-数组
-1.4-算法的流程控制
--第一章 Java语言基础知识--1.4-算法的流程控制
-1.5-第一章小结
-第一章编程练习题
-课件
--外部链接
-Java环境配置、Eclipse使用、Helloworld程序详解
--使用eclipse建立Java项目、编写和运行Java程序
-Java数据类型
--Java整数类型
--Java浮点类型
--数据类型实战
--数据类型转换
--Java强制类型转换精度损失示例与表达式中的数据类型转换
-Java数组
-Java变量
--Java的变量
-命令行参数
--命令行参数的介绍
-2.0-导学
--2.0-导学
-2.1-面向对象方法的特性
--第二章 类与对象--2.1-面向对象方法的特性
-2.2-1-类声明与对象创建
--第二章 类与对象--2.2-1-类声明与对象创建
-2.2-2-数据成员
--第二章 类与对象--2.2-2-数据成员
-2.2-3-方法成员
--第二章 类与对象--2.2-3-方法成员
-2.2-4-包
--2.2-4-包
--第二章 类与对象--2.2-4-包
-2.2-5-类的访问权限控制
--第二章 类与对象--2.2-5-类的访问权限控制
-2.3-1-对象初始化
--第二章 类与对象--2.3-1-对象初始化
-2.3-2-内存回收
--第二章 类与对象--2.3-2-内存回收
-2.4-枚举类
--2.4-枚举类
--第二章 类与对象--2.4-枚举类
-2.5-应用举例
--2.5-应用举例
-2.6-第2章小结
-第二章编程练习题
-课件
--第二章课件
-3.0-导学
--3.0-导学
-3.1.1-3.1.2-类继承的概念和语法
--第三章 类的重用--3.1.1-3.1.2-类继承的概念和语法
-3.1.3-隐藏和覆盖
--第三章 类的重用--3.1.3-隐藏和覆盖
-3.2-Object 类
--第三章 类的重用--3.2-Object 类
-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.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集合框架介绍
--第六章 对象群体的组织--6.1-Java集合框架介绍
-6.2-主要接口及常用的实现类
--第六章 对象群体的组织--6.2-主要接口及常用的实现类
-6.3-常用算法
--常用算法
-6.4-数组实用方法
-6.5-基于动态数组的类型(Vector, ArrayList)
--基于动态数组的类型(Vector, ArrayList)
-6.6-遍历Collection
-6.7-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.10-中间层容器(二)
-7.11-原子组件(一)
-7.12-原子组件(二)
-7.13-原子组件(三)
-7.14-其它Swing特性
-7.15-第7章小结
-课件
--课件