面向对象程序设计 、
第二章 面向对象的分析与设计
学习目标 1 确定系统中的对象 2 确定对象的属性及操作 3 测试对象的有效性 4 区分对象和类 5 了解面向对象的编程和过程化编程之间的区别 6 了解封装的主要好处 7 了解软件开发的主要步骤
我们可以把生活所在的真实世界( Real World )当作是由许多大小不同的对象所组成 的。对象可以是有生命的个体,比如一个人 或一只鸟。 对象
对象也可以是无生命 的个体,比如一辆汽 车或一台计算机。 对象也可以是一个抽 象的概念,如天气的 变化或鼠标所产生的 事件。
对象的基本概念 客观世界的组成: – 对象; – 对象之间的相互关系; 对象:对象是系统中用来描述客观事物的 一个实体,它是构成系统的一个基本单位。 一个对象由一组属性和操作组成。 动态观点:对象的操作就是对象的行为
对象的特征 对象有两个特征:属性和行为 如: 一个人有他的身高或体重作属性,有他 的行为 —— 如唱歌、打球、骑摩托车、开 汽车。 一条狗有它的颜色作属性,有它的行为, 如摇尾巴或跳跃。 一台电视机有它的外形、尺寸和颜色, 有它的行为,如开、关,接收信号,转换 频道,调节音量。
换档 开大灯 煞车 开冷气 颜色 排档数排档数 排气量 轮胎型号 汽车对象 以汽车为例,我们可定义其属性与方法如:
课程中通过下面的案例来学习面向对象 的分析与设计原理。 案例研究 公司名称: DirectClothing 公司 业务包括: 1 、按月生成产品目录 2 、客户通过电话、网络和传真订购 3 、随时检查订购项的库存情况 4 、公司接受支票和信用卡付款
定义系统的: 对象 1 、对象属性 —— 对象的特征 2 、对象操作 —— 所能执行的任务 面向对象概述
找出问题描述领域中的主要名词 对象可能是: 简单的或复杂的(衬衣,银行) 真实的或概念的(银行出纳员,帐户) 对象有: 属性 ( 颜色,尺寸 ) 操作(下订单,取消订单) 第一步:确定对象
对象找到了!
属性:是对象的状态特征 可以是数据或其它对象 对 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 ) 动物类汽车类
类与对象关系 面向对象程序设计的重点是类的设计,而不是对象的 设计。
类与对象的关系 类 对象 抽象定义 实例 电视机 一台 长虹电视机 学生 软件学院 05 级学生小强
实例对象 ( instance ) 汽车类有些共同的属性(汽缸 排气量,排档数,颜色,轮胎 数 …… )和行为(换档,开灯, 开冷气 …… ),但每一台汽车 个别的状态及方法可不同于且 独立于其他汽车 。 你的汽车只是这世界中许多汽 车中的一个。我们就称你的汽 车是汽车类中的一个实例对象 ( instance )。 汽车类 ( class) 实例 ( instance) NEW 你的车
面向对象与面向过程 公共数据 函数 算法+数据结构 属性 操作 属性 操作 过程化程序设计 OOP 程序设计 对象+消息 消息
比较 结构化程序设计 – 对应的典型的计算机语言, 例如 : C – 面向操作的 – 函数 ( 方法 ) 是程序的基本单位 面向对象程序设计 – 对应的典型的计算机语言, 例如 : Java – 面向对象 (object) 的 – 类 (class) 是程序的基本单位 方法 ( 函数 ) 被封装在类中 数据也常常被封装在类中
示例 : 过程化和面向对象两种方法的比较 几个编程小组在设计一个进销存系统 其中,一个小组编写处理货物和库存的程 序,一个小组编写处理订单的程序
面向过程
面向对象
OO 的真正意义 OO 的真正意义是使得软件开发接近人类的正常思维, 将许多原来由人完成的工作交给机器去完成: - 机器语言汇编语言 高级语言 - 面向过程面向模块 面向对象 OO 包括一套比较完整的方法,程序设计只是其中一 个环节。 - 面向对象的分析 - 面向对象的设计 - 面向对象的程序设计 - 代码重用
小 结小 结 Java 程序是由一个个类定义组成的 编写 java 程序的过程是从现实世界中抽象出 java 可实现的类,并用合适的语句定义它的 过程 这个定义过程包括: 1 、对类中各种属性和方法的定义 2 、创建类的对象 3 、类间的各种关系和接口的定义
什么是面向对象? 面向对象是一种程序设计规范, 其基本思想 是使用对象、类、继承、封装、多态等基 本概念来进行程序设计。
OOP 三大特性:封装、继承与多态 封装( encapsulation ) 封装是一种信息隐藏技术。 是指将数据和基于数据的操作封装在一起,数据被 保护在内部,系统的其他部分只有通过在数据外面 的被授权的操作才能够进行交互,目的在于将类使 用者 class user 和类设计者 class creator 分开。 在面向对象的编程中,用类来封装相关的数据和 方 法,保证了数据的安全和系统的严密性。
仓库 属性 操作 价格表, 物品, 账单,电话, 等等 提供物品 ,账单等 等 考虑一个仓库,外部只能通过管理员获取物品 。 抽象
封装的优点 – 隐藏类的实现细节, 实现了信息的隐藏 及安全性; – 提高了程序的模块化,且易于维护; – 具体实现是编写该类的人控制的, 让使 用者只能通过事先定制好的方法来访问 数据,可以方便地加入控制逻辑,限制 对属性的不合理操作
封装的汽车: 实现细节隐藏在车盖 下;驾驶员不必知道 汽车是怎样工作的 汽车的部分零件改变或更换,驾驶员不必改 变对汽车的驾驶
交通工具 车船 飞机 汽车 火车 父类 / 超类 ( SuperClass ) 子类 Java 仅支持 单继承 优点: 使程序结构清晰,减少了编码和维护的工作量,子 类可以使用父类所提供的方法,实现了代码的复用。 class ThisClass extends SuperClass{ … } 现以下图来说明: 继承
汽车类 轿车 公交车 的士
多态 – 用同一个名字调用实现不同操作的方法 – 方式 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 ), 放在同一个实体中。 2. 继承:父类定义一些通用的属性与行为, 其子类可以使用。 3. 多态:在同一个类中可有许多同名的方法, 但其参数个数与参数类型不同,而且操作过 程与返回值也可能会不同。 ( 1 )模块化 ( 2 )信息隐藏 ( 1 )实现代码复用 ( 2 )简化设计过程 解决其他语言中 不能重名的问题
以前编写的操作可以在其他工程中再次使用, 可提高开发效率,缩短开发周期 复用
面向对象软件开发过程(软件生命周期) 1 、搜集和分析要求 2 、设计系统 3 、为系统编写代码 4 、测试系统的所有方面 5 、让客户和用户测试系统 6 、维护系统