第二章
面向对象的分析与设计
学习目标
? 确定系统中的对象
? 确定对象的属性及操作
? 测试对象的有效性
? 区分对象和类
? 说出面向对象的编程和过程化编程之间的区别
? 解释封装的主要好处
? 列出软件开发的主要步骤
? 对象 ( object)
? 我们可以把生活所在的真实世界( Real
World)当作是由许多大小不同的对象所组成
的。对象可以是有生命的个体,比如一个人
或一只鸟。
对象
? 对象也可以是无生命
的个体,比如一辆汽
车或一台计算机 。
? 对象也可以是一件抽
象的概念,如天气的
变化或鼠标所产生的
事件 。
对象的特征
? 对象有两个特征:属性和行为
? 例如:
人有他的身高或体重作属性,有他的行
为 —— 如唱歌、打球、骑摩托车、开汽车。
狗有它的颜色作属性,有它的行为,如
吠叫或跳跃 。
电视机有它的外形、尺寸和颜色,有它
的行为,如开、关,接收信号,转换频道,
调节音量。
换档
开大灯
煞车
开冷气
颜色
排 档 数
排气量
轮胎型号
汽车对象
? 以汽车为例,我们可定义其属性与方法如:
? 本教程 中使用下面的示例来应用面向对
象的分析与设计原理。
?公司名称,DirectClothing公司
?按月生成目录
?客户可以打电话、使用邮寄和传真
?必须每个检查订购项的存货水平
?DirectClothing接受支票和信用卡
案例研究
? 系统建模技术
? 尝试描述一个系统在现实生活中的情形
? 定义系统的:
?对象 ——让对象工作的问题
?对象属性 ——对象的特征
?对象操作 ——所能执行的任务
面向对象概述
对象,
? 找出问题描述领域中的 主要名词
? 对象可能是:
?简单的或复杂的(衬衣,银行)
?真实的或概念的(银行出纳员,帐户)
? 对象有:
?属性 (颜色,尺寸 )
?操作(下订单,取消订单)
确定对象
? 属性:是对象的特征
?可以是数据或对象
?对 Order对象来说,可能包括 orderID和 items
? 操作:是对象执行的动作
?可以是对象做出的或施加给对象的动作
?对 Order对象来说,可能是 place和 cancel
确定对象属性和操作
建模对象
属性类型
? 与问题域的相关性
?对象是否在问题陈述的界限之内?
?系统是否必须有此对象才能完成任务?
?在用户与系统的交互中是否必须有此对象?
? 独立存在性
? 属性和操作
测试对象
分析问题域
? 实验目标:找出问题域中的对象,及其属
性和操作
? 步骤,1、列出有关的对象(名词)
2、列出这些对象的属性和操作
3、为对象设置合理的属性和操作
4、应用上述的 3条评判规则检验对
象的有效性
练习
An object-oriented design for a Java
application that tracks soccer scores.The
program should track:
? The number of goals each player scores in
each game
? What teams the players play for and what
season the games were play in
?
类 ( class)
? 在真实世界里,有许多同“种类”的对
象。而这些同“种类”的对象可被归类
为一个“类”。例如我们可将世界上所
有的汽车归类为汽车类,所有的动物归
为动物类 。
动物类 汽车类
什么是类? 是同种对象的集合与抽象
类与对象的关系 类 ? 对象
抽象定义 实例
电视机 ? 一台 长虹电视机
学生 ? 学生王强
类与对象
如果将对象比作汽车,那么类就是汽车的设计图纸。
所以面向对象程序设计的重点是类的设计,而不是对
象的设计。
实例 ( instance)
? 汽车类有些共同的状态(汽缸
排气量,排档数,颜色,轮胎
数 …… )和行为(换档,开灯,
开冷气 …… ),但每一台汽车
个别的状态及方法可不同于且
独立于其他汽车 。
? 你的汽车只是这世界中许多汽
车中的一个。我们就称你的汽
车对象是汽车类中的一个实例
( instance) 。
汽车类
( class)
实例
( instance)
NEW
你的车
OO的真正意义
? OO的真正意义是使得软件开发接近人类的正常思维,
将许多原来由人完成的工作交给机器去完成:
? -机器语言 汇编语言 高级语言
? -面向过程 面向模块 面向对象
? OO包括一套比较完整的方法,程序设计只是其中一
个环节。
? -面向对象的分析
? -面向对象的设计
? -面向对象的程序设计
? -代码重用
面向对象与面向过程
公共数据
函数
函数
函数
函数
算法+数据结构
属性数据
方法
属性数据
方法
过程式程序设计 OOP程序设计
对象+消息
消息
面向过程
面向对象
OOP三大特性:封装、继承与多态
?封装( encapsulation )
? 封装是一种信息隐藏技术。
? 是指利用抽象数据类型将数据和基于数据的操作封
装在一起,数据被保护在抽象数据类型的内部,系
统的其他部分只有通过在数据外面的被授权的操作
才能够与这个抽象数据类型进行交互。
? 在面向对象的编程中,用类来封装相关的数据和 方
法,保证了数据的安全和系统的严密性。
仓库 属性
操作
价格表,物品,
账单,电话,
等等
提供物品
,账单等
等
考虑一个仓库,外部只能通过管理员获取物品
。
抽象
? 封装的优点
– 隐藏类的实现细节,实现了信息的隐藏
及安全性;
– 提高了程序的模块化,且易于维护;
– 具体实现是编写该类的人控制的,让使
用者只能通过事先定制好的方法来访问
数据,可以方便地加入控制逻辑,限制
对属性的不合理操作
?继承 (inheritance)
? OOP是以类来定义一个对象的。
? 当一个类拥有另一个类的所有数据和方法时,就称这两个类之间
具有继承关系。
? 现以下图来说明:
汽车类
轿车 巴士计程车
轿车、出租车、巴士都是汽车,故属汽车类,我们称其继承 (inherit)汽车
类,而轿车、出租车、巴士也都可自成一种类。这样汽车类就称为超类
( superclass)或父类,而轿车、出租车、巴士就称作子类 。
? 继承
交通工具
车
船
飞机
汽车
火车
父类 /超类
( superclass)
子类
( subclass)
Java仅支持
单继承
优点:
使程序结构清晰,减少了编码和维护的工作量,子
类可以使用父类所提供的方法,实现了代码的复用。
? 多态
– 用同一个名字调用实现不同操作的方法
– 方式 1:父类和子类之间的同名方法
(覆盖:子类方法的名称和参数与父类方法的名称和参数相同,在执行过程中,子类的
方法将覆盖父类的方法)
– 方式 2:同一类中参数不同的同名方法
(重载:不是子类对父类同名方法的重新定义,而是类对自身已有的同名方法的重新定
义。重载方法的参数必须不同,或者是参数个数不同,或者是参数类型不同)
– 使用方便,且降低了维护和编程量
覆盖 class A
{
public int x,y;
A(int a,int b)
{
x=a;
y=b;
}
public void display()
{
int z;
z=x+y;
System.out.println(―add=‖+z);
}
}
class B extends A
{
B(int a,int b)
{
super(a,b);
}
public void display()
{
int z;
z=x*y;
System.out.println(―product=‖+z);
}
}
class AB extends B
{
AB(int x,int y)
{
super(x,y);
}
public static void main(String[] args)
{
A num1=new A(4,10);
B num2=new B(4,10);
AB num3=new AB(4,10);
num1.display();
num2.display();
num3.display();
}
}
重载 class MethodOverloading
{
void receive (int i)
{
System.out.println(―一个整数” );
System.out.println(―i=‖+i);
}
void receive (int x,int y)
{
System.out.println(―两个整数” );
System.out.println(―x=‖+x+‖y=‖+y);
}
void receive (double d)
{
System.out.println(―一个浮点数” );
System.out.println(―d=‖+d);
}
void receive (String s)
{
System.out.println(―一个字符串” );
System.out.println(―s=‖+s);
}
}
public class MethodOverloadingTest
{
public static void main(String[] args)
{
MethodOverloading MO=new MethodOverloading();
mo.receive(1);
mo.receive(2,3);
mo.receive(12.56);
mo.receive(―Hello‖);
}
}
面向对象的三大特征
? 1.封装:将数据成员( Data Member)和属于此数
据的操作方法( Operating Method),放在同一个
实体( Entity)或对象中。
? 2.继承:父类定义( Define)一些通用的属性与行
为,其孩子继续使用。
? 3.多态:在同一个类中可有许多同名的方法,但其
参数数量与数据类型不同,而且操作过程与返回值
也可能会不同。
( 1)模块化
( 2) 信息隐藏
( 1)实现代码复用
( 2)简化设计过程
解决其他语言中
不能重名的问题
接 口
? Interface 这个英文字的意思是一种装置或
系统,使得不同性质的实体( entities)能
够交互地运作。比如,计算机的操作系统
( operating system),可把它称作是一种
“人机接口”。可使得使用者(人)与计
算机(机),通过鼠标或键盘等装置,而
作为一种沟通接口,来与计算机做沟通,
以指挥计算机做事。另外像 RS232串行端
口,常作为输入 /输出设备传输接口,是计
算机与输入 /输出设备间的接口 。
? 而在 Java里,设计接口的用意,是可使得类不必受限于单一继
承的关系,而可灵活地同时继承一些共有的特性,达到多重继
承的目的,而免去 C++中多重继承的复杂关系所产生的 bug 。
? 像下图中的出租车,可继承“营业车”,“小车”、“汽油车”
等类,却不一定非要与同样继承“自用车”、“小车”,“汽
油车”的轿车有上下继承的关系 。
汽车类
自用车 营业车 小车 大车 汽油车 柴油车
轿车 出租车 巴士
上 类
接口
次类
? 改变程序的一部分不影响其他部分。
? 程序的其他部分与类的接口(“外部”)进行交互
? 更改类的实现(“内部”)而不更改接口
? 封装的汽车:
?实现细节隐藏在车盖 下;驾驶员不必知道
汽车是怎样工作的
?汽车的部分零件改变或更换,驾驶员不必
改变对汽车的驾驶
接口和实现
接口的定义
接口可以理解为一个特殊的类,只有 常量 和 抽象方法 组成的特殊类。
interface Collection
{
int MAX_NUM=100;
void add(int a);
void delete(int b);
int find(int c);
int currentCount();
}
? 以前编写的操作可以在其他工程中再次使用,
可提高开发效率,缩短开发周期
复用
需求分析
需求模型化
概要设计
详细设计
实现
用户需求
明确细化
需求
分析
实现
设计
重新明确需求
用户需求
可重用部件的引用和开发
修改详细设计 选择开发工具
编码
设计界面管理、任务
管理和数据管理
抽取对象模型、属性、结构、建立 OOA 模型
需求陈述
修改概要设计
面向对象软件开发过程(软件生命周期) ? 1、搜集和分析要求
? 2、设计系统
? 3、为系统编写代码
? 4、测试系统的所有方面
? 5、让客户和用户测试系统
? 6、维护系统
面向对象的分析与设计
学习目标
? 确定系统中的对象
? 确定对象的属性及操作
? 测试对象的有效性
? 区分对象和类
? 说出面向对象的编程和过程化编程之间的区别
? 解释封装的主要好处
? 列出软件开发的主要步骤
? 对象 ( object)
? 我们可以把生活所在的真实世界( Real
World)当作是由许多大小不同的对象所组成
的。对象可以是有生命的个体,比如一个人
或一只鸟。
对象
? 对象也可以是无生命
的个体,比如一辆汽
车或一台计算机 。
? 对象也可以是一件抽
象的概念,如天气的
变化或鼠标所产生的
事件 。
对象的特征
? 对象有两个特征:属性和行为
? 例如:
人有他的身高或体重作属性,有他的行
为 —— 如唱歌、打球、骑摩托车、开汽车。
狗有它的颜色作属性,有它的行为,如
吠叫或跳跃 。
电视机有它的外形、尺寸和颜色,有它
的行为,如开、关,接收信号,转换频道,
调节音量。
换档
开大灯
煞车
开冷气
颜色
排 档 数
排气量
轮胎型号
汽车对象
? 以汽车为例,我们可定义其属性与方法如:
? 本教程 中使用下面的示例来应用面向对
象的分析与设计原理。
?公司名称,DirectClothing公司
?按月生成目录
?客户可以打电话、使用邮寄和传真
?必须每个检查订购项的存货水平
?DirectClothing接受支票和信用卡
案例研究
? 系统建模技术
? 尝试描述一个系统在现实生活中的情形
? 定义系统的:
?对象 ——让对象工作的问题
?对象属性 ——对象的特征
?对象操作 ——所能执行的任务
面向对象概述
对象,
? 找出问题描述领域中的 主要名词
? 对象可能是:
?简单的或复杂的(衬衣,银行)
?真实的或概念的(银行出纳员,帐户)
? 对象有:
?属性 (颜色,尺寸 )
?操作(下订单,取消订单)
确定对象
? 属性:是对象的特征
?可以是数据或对象
?对 Order对象来说,可能包括 orderID和 items
? 操作:是对象执行的动作
?可以是对象做出的或施加给对象的动作
?对 Order对象来说,可能是 place和 cancel
确定对象属性和操作
建模对象
属性类型
? 与问题域的相关性
?对象是否在问题陈述的界限之内?
?系统是否必须有此对象才能完成任务?
?在用户与系统的交互中是否必须有此对象?
? 独立存在性
? 属性和操作
测试对象
分析问题域
? 实验目标:找出问题域中的对象,及其属
性和操作
? 步骤,1、列出有关的对象(名词)
2、列出这些对象的属性和操作
3、为对象设置合理的属性和操作
4、应用上述的 3条评判规则检验对
象的有效性
练习
An object-oriented design for a Java
application that tracks soccer scores.The
program should track:
? The number of goals each player scores in
each game
? What teams the players play for and what
season the games were play in
?
类 ( class)
? 在真实世界里,有许多同“种类”的对
象。而这些同“种类”的对象可被归类
为一个“类”。例如我们可将世界上所
有的汽车归类为汽车类,所有的动物归
为动物类 。
动物类 汽车类
什么是类? 是同种对象的集合与抽象
类与对象的关系 类 ? 对象
抽象定义 实例
电视机 ? 一台 长虹电视机
学生 ? 学生王强
类与对象
如果将对象比作汽车,那么类就是汽车的设计图纸。
所以面向对象程序设计的重点是类的设计,而不是对
象的设计。
实例 ( instance)
? 汽车类有些共同的状态(汽缸
排气量,排档数,颜色,轮胎
数 …… )和行为(换档,开灯,
开冷气 …… ),但每一台汽车
个别的状态及方法可不同于且
独立于其他汽车 。
? 你的汽车只是这世界中许多汽
车中的一个。我们就称你的汽
车对象是汽车类中的一个实例
( instance) 。
汽车类
( class)
实例
( instance)
NEW
你的车
OO的真正意义
? OO的真正意义是使得软件开发接近人类的正常思维,
将许多原来由人完成的工作交给机器去完成:
? -机器语言 汇编语言 高级语言
? -面向过程 面向模块 面向对象
? OO包括一套比较完整的方法,程序设计只是其中一
个环节。
? -面向对象的分析
? -面向对象的设计
? -面向对象的程序设计
? -代码重用
面向对象与面向过程
公共数据
函数
函数
函数
函数
算法+数据结构
属性数据
方法
属性数据
方法
过程式程序设计 OOP程序设计
对象+消息
消息
面向过程
面向对象
OOP三大特性:封装、继承与多态
?封装( encapsulation )
? 封装是一种信息隐藏技术。
? 是指利用抽象数据类型将数据和基于数据的操作封
装在一起,数据被保护在抽象数据类型的内部,系
统的其他部分只有通过在数据外面的被授权的操作
才能够与这个抽象数据类型进行交互。
? 在面向对象的编程中,用类来封装相关的数据和 方
法,保证了数据的安全和系统的严密性。
仓库 属性
操作
价格表,物品,
账单,电话,
等等
提供物品
,账单等
等
考虑一个仓库,外部只能通过管理员获取物品
。
抽象
? 封装的优点
– 隐藏类的实现细节,实现了信息的隐藏
及安全性;
– 提高了程序的模块化,且易于维护;
– 具体实现是编写该类的人控制的,让使
用者只能通过事先定制好的方法来访问
数据,可以方便地加入控制逻辑,限制
对属性的不合理操作
?继承 (inheritance)
? OOP是以类来定义一个对象的。
? 当一个类拥有另一个类的所有数据和方法时,就称这两个类之间
具有继承关系。
? 现以下图来说明:
汽车类
轿车 巴士计程车
轿车、出租车、巴士都是汽车,故属汽车类,我们称其继承 (inherit)汽车
类,而轿车、出租车、巴士也都可自成一种类。这样汽车类就称为超类
( superclass)或父类,而轿车、出租车、巴士就称作子类 。
? 继承
交通工具
车
船
飞机
汽车
火车
父类 /超类
( superclass)
子类
( subclass)
Java仅支持
单继承
优点:
使程序结构清晰,减少了编码和维护的工作量,子
类可以使用父类所提供的方法,实现了代码的复用。
? 多态
– 用同一个名字调用实现不同操作的方法
– 方式 1:父类和子类之间的同名方法
(覆盖:子类方法的名称和参数与父类方法的名称和参数相同,在执行过程中,子类的
方法将覆盖父类的方法)
– 方式 2:同一类中参数不同的同名方法
(重载:不是子类对父类同名方法的重新定义,而是类对自身已有的同名方法的重新定
义。重载方法的参数必须不同,或者是参数个数不同,或者是参数类型不同)
– 使用方便,且降低了维护和编程量
覆盖 class A
{
public int x,y;
A(int a,int b)
{
x=a;
y=b;
}
public void display()
{
int z;
z=x+y;
System.out.println(―add=‖+z);
}
}
class B extends A
{
B(int a,int b)
{
super(a,b);
}
public void display()
{
int z;
z=x*y;
System.out.println(―product=‖+z);
}
}
class AB extends B
{
AB(int x,int y)
{
super(x,y);
}
public static void main(String[] args)
{
A num1=new A(4,10);
B num2=new B(4,10);
AB num3=new AB(4,10);
num1.display();
num2.display();
num3.display();
}
}
重载 class MethodOverloading
{
void receive (int i)
{
System.out.println(―一个整数” );
System.out.println(―i=‖+i);
}
void receive (int x,int y)
{
System.out.println(―两个整数” );
System.out.println(―x=‖+x+‖y=‖+y);
}
void receive (double d)
{
System.out.println(―一个浮点数” );
System.out.println(―d=‖+d);
}
void receive (String s)
{
System.out.println(―一个字符串” );
System.out.println(―s=‖+s);
}
}
public class MethodOverloadingTest
{
public static void main(String[] args)
{
MethodOverloading MO=new MethodOverloading();
mo.receive(1);
mo.receive(2,3);
mo.receive(12.56);
mo.receive(―Hello‖);
}
}
面向对象的三大特征
? 1.封装:将数据成员( Data Member)和属于此数
据的操作方法( Operating Method),放在同一个
实体( Entity)或对象中。
? 2.继承:父类定义( Define)一些通用的属性与行
为,其孩子继续使用。
? 3.多态:在同一个类中可有许多同名的方法,但其
参数数量与数据类型不同,而且操作过程与返回值
也可能会不同。
( 1)模块化
( 2) 信息隐藏
( 1)实现代码复用
( 2)简化设计过程
解决其他语言中
不能重名的问题
接 口
? Interface 这个英文字的意思是一种装置或
系统,使得不同性质的实体( entities)能
够交互地运作。比如,计算机的操作系统
( operating system),可把它称作是一种
“人机接口”。可使得使用者(人)与计
算机(机),通过鼠标或键盘等装置,而
作为一种沟通接口,来与计算机做沟通,
以指挥计算机做事。另外像 RS232串行端
口,常作为输入 /输出设备传输接口,是计
算机与输入 /输出设备间的接口 。
? 而在 Java里,设计接口的用意,是可使得类不必受限于单一继
承的关系,而可灵活地同时继承一些共有的特性,达到多重继
承的目的,而免去 C++中多重继承的复杂关系所产生的 bug 。
? 像下图中的出租车,可继承“营业车”,“小车”、“汽油车”
等类,却不一定非要与同样继承“自用车”、“小车”,“汽
油车”的轿车有上下继承的关系 。
汽车类
自用车 营业车 小车 大车 汽油车 柴油车
轿车 出租车 巴士
上 类
接口
次类
? 改变程序的一部分不影响其他部分。
? 程序的其他部分与类的接口(“外部”)进行交互
? 更改类的实现(“内部”)而不更改接口
? 封装的汽车:
?实现细节隐藏在车盖 下;驾驶员不必知道
汽车是怎样工作的
?汽车的部分零件改变或更换,驾驶员不必
改变对汽车的驾驶
接口和实现
接口的定义
接口可以理解为一个特殊的类,只有 常量 和 抽象方法 组成的特殊类。
interface Collection
{
int MAX_NUM=100;
void add(int a);
void delete(int b);
int find(int c);
int currentCount();
}
? 以前编写的操作可以在其他工程中再次使用,
可提高开发效率,缩短开发周期
复用
需求分析
需求模型化
概要设计
详细设计
实现
用户需求
明确细化
需求
分析
实现
设计
重新明确需求
用户需求
可重用部件的引用和开发
修改详细设计 选择开发工具
编码
设计界面管理、任务
管理和数据管理
抽取对象模型、属性、结构、建立 OOA 模型
需求陈述
修改概要设计
面向对象软件开发过程(软件生命周期) ? 1、搜集和分析要求
? 2、设计系统
? 3、为系统编写代码
? 4、测试系统的所有方面
? 5、让客户和用户测试系统
? 6、维护系统