第3节 多态的概念
7.3 多态的概念
多态
是指不同类型的对象可以响应相同的消息
从相同的基类派生出来的多个类型可被当作同一种类型对待,可对这些不同的类型进行同样的处理,由于多态性,这些不同派生类对象响应同一方法时的行为是有所差别的
例如
所有的Object类的对象都响应toString()方法
所有的BankAccount类的对象都响应deposit()方法
7.3.1 多态的目的
多态的目的
所有的对象都可被塑型为相同的类型,响应相同的消息
使代码变得简单且容易理解
使程序具有很好的“扩展性”
7.3.1 多态的目的——一个例子
绘图
希望能够画出任意子类型对象的形状,可以在Shape 类中声明几个绘图方法,对不同的实际对象,采用不同的画法
if (aShape instanceof Circle) aShape.drawCircle();
if (aShape instanceof Triangle) aShape.drawTriangle();
if (aShape instanceof Rectangle)aShape.drawRectangle();

7.3.1 多态的目的——一个例子
更好的方式
在每个子类中都声明同名的draw()方法
以后绘图可如下进行
Shape s = new Circle();
s.draw();
Circle属于Shape的一种,系统会执行自动塑型
当调用方法draw时,实际调用的是Circle.draw()
在程序运行时才进行绑定,接下来介绍绑定的概念

7.3.2 绑定的概念
绑定
指将一个方法调用同一个方法主体连接到一起
根据绑定时期的不同,可分为
早期绑定(静态绑定)——方法的重载
程序运行之前执行绑定
晚期绑定(动态绑定)——方法的重写
也叫作“动态绑定”或“运行期绑定
基于对象的类别,在程序运行时执行绑定
7.3.2 绑定的概念——例7_8
仍以绘图为例,所有类都放在binding包中
基类Shape建立了一个通用接口
class Shape { void draw() {}void erase() {} }
派生类覆盖了draw方法,为每种特殊类型的几何形状都提供独一无二的行为
class Circle extends Shape { void draw()
{ System.out.println("Circle.draw()"); }
void erase()
{ System.out.println("Circle.erase()"); } }
7.3.2 绑定的概念——例7_8
class Square extends Shape { void draw()
{ System.out.println("Square.draw()"); }
void erase()
{ System.out.println("Square.erase()"); } }
class Triangle extends Shape { void draw()
{ System.out.println("Triangle.draw()"); }
void erase()
{ System.out.println("Triangle.erase()"); }}
对动态绑定进行测试如下
public class BindingTester{ public static void main(String[] args) { Shape[] s = new Shape[9];
int n;
for(int i = 0; i < s.length; i++) { n = (int)(Math.random() * 3);
switch(n) { case 0: s[i] = new Circle(); break;
case 1: s[i] = new Square(); break;
2: s[i] = new Triangle();
} }
for(int i = 0; i < s.length; i++) s[i].draw(); }}
7.3.2 绑定的概念——例7_8运行结果
运行结果
Square.draw()
Triangle.draw()
Circle.draw()
.draw()
Triangle.draw()
Circle.draw()
Square.draw()
Circle.draw()
Triangle.draw()
说明
编译的时候是无法知道s数组元素的具体类型到底是什么运行的时候才能确定究竟是什么类型,所以是动态绑定在主方法的循环体中,每次根据运行时产生的随机数生成指向一个Circle、Square或者Triangle的引用,所以每次运行都可能有不同的结果
多态
是指不同类型的对象可以响应相同的消息
从相同的基类派生出来的多个类型可被当作同一种类型对待,可对这些不同的类型进行同样的处理,由于多态性,这些不同派生类对象响应同一方法时的行为是有所差别的
例如
所有的Object类的对象都响应toString()方法
所有的BankAccount类的对象都响应deposit()方法
7.3.1 多态的目的
多态的目的
所有的对象都可被塑型为相同的类型,响应相同的消息
使代码变得简单且容易理解
使程序具有很好的“扩展性”
7.3.1 多态的目的——一个例子
绘图
希望能够画出任意子类型对象的形状,可以在Shape 类中声明几个绘图方法,对不同的实际对象,采用不同的画法
if (aShape instanceof Circle) aShape.drawCircle();
if (aShape instanceof Triangle) aShape.drawTriangle();
if (aShape instanceof Rectangle)aShape.drawRectangle();

7.3.1 多态的目的——一个例子
更好的方式
在每个子类中都声明同名的draw()方法
以后绘图可如下进行
Shape s = new Circle();
s.draw();
Circle属于Shape的一种,系统会执行自动塑型
当调用方法draw时,实际调用的是Circle.draw()
在程序运行时才进行绑定,接下来介绍绑定的概念

7.3.2 绑定的概念
绑定
指将一个方法调用同一个方法主体连接到一起
根据绑定时期的不同,可分为
早期绑定(静态绑定)——方法的重载
程序运行之前执行绑定
晚期绑定(动态绑定)——方法的重写
也叫作“动态绑定”或“运行期绑定
基于对象的类别,在程序运行时执行绑定
7.3.2 绑定的概念——例7_8
仍以绘图为例,所有类都放在binding包中
基类Shape建立了一个通用接口
class Shape { void draw() {}void erase() {} }
派生类覆盖了draw方法,为每种特殊类型的几何形状都提供独一无二的行为
class Circle extends Shape { void draw()
{ System.out.println("Circle.draw()"); }
void erase()
{ System.out.println("Circle.erase()"); } }
7.3.2 绑定的概念——例7_8
class Square extends Shape { void draw()
{ System.out.println("Square.draw()"); }
void erase()
{ System.out.println("Square.erase()"); } }
class Triangle extends Shape { void draw()
{ System.out.println("Triangle.draw()"); }
void erase()
{ System.out.println("Triangle.erase()"); }}
对动态绑定进行测试如下
public class BindingTester{ public static void main(String[] args) { Shape[] s = new Shape[9];
int n;
for(int i = 0; i < s.length; i++) { n = (int)(Math.random() * 3);
switch(n) { case 0: s[i] = new Circle(); break;
case 1: s[i] = new Square(); break;
2: s[i] = new Triangle();
} }
for(int i = 0; i < s.length; i++) s[i].draw(); }}
7.3.2 绑定的概念——例7_8运行结果
运行结果
Square.draw()
Triangle.draw()
Circle.draw()
.draw()
Triangle.draw()
Circle.draw()
Square.draw()
Circle.draw()
Triangle.draw()
说明
编译的时候是无法知道s数组元素的具体类型到底是什么运行的时候才能确定究竟是什么类型,所以是动态绑定在主方法的循环体中,每次根据运行时产生的随机数生成指向一个Circle、Square或者Triangle的引用,所以每次运行都可能有不同的结果


