第3章-面向对象(上)-补充案例
第03章 一个面向对象的C++程序实例
从而建立起问题域的对象模型。
3.1.2 面向对象分析
⒈确定对象
使用“语法分析 ”方法。在需求陈述中包含
的名
词或名词短语是对象的候选者, 它们有下列一些: 显示器荧光屏,圆心坐标,位置,半径,圆, 弧,起始角度,结束角度。
3.1.2 面向对象分析
“显示器荧光屏”是一种输出设备,是运行程序的 物 质基础(硬件平台),应该从候选对象中删去。“圆心 坐标”和“半径”实质上是圆和弧的基本属性,并不需 要独 立存在,因此也应该从候选者中删去。“位置”实际上 是 指圆心的位置,也就是圆心坐标,没必要重复列出。 “起始角度”和“结束角度”实质上是弧的属性,也应 该从 候选者中删去。最后得出的对象是,圆(Circle)和弧 (Arc),更确切地说,是圆和弧两类对象。 在本问题域中实际上有两个具体的圆和一个具体
3.1.2 面向对象分析
⒉确定属性
圆的两个基本属性是圆心坐标和半径,弧的基
本属性有圆心坐标,半径,起始角度和结束角
度。不可能在需求陈述中找到所有属性,还必须
借助领域知识和常识,才能分析得出所需要的全 部属性,圆和弧都应该再增加一个属性-可见性。
3.1.2 面向对象分析
⒊确定服务 在分析阶段可以认为,每个属性都是可以访 问的。所谓可以访问是指提供了访问对象属性的
3.2.2 说明数据成员
在类定义中,共有三种访问权符:
⒈private为私有的访问权符。为了使得成员仅在说明它的类中可以直接 访问,超出该类范围均不能直接访问,则需要在此成员前面使用private 访问权符。 ⒉protected 为保护的访问权符。这个访问权符的含义是,在它下面说明 的成员(数据成员或成员函数)仅在本类及其子类中可以直接访问。因 此,描述坐标的两个数据成员X和Y在Location类中可直接访问,在其子 类Point中也可直接访问继承来的数据成员X和Y。 ⒊public为公有的访问权符。具有这种访问属性的成员,可被与该类对 象处在同一作用域内的任何一个外部函数使用。 因此,被称为对象与外 界的接口。通常,在这部分仅定义一些成员函数,作为该类产生的对象 向外界所能提供的服务。
面向对象分析实例
4
学生ID 自选习题,
5
习题解答 核对答案
练习本类的属性和方法
确定对象类
属性: 方法:
01
习题号 编写习题,
02
题目内容 编写答案,
03
答案 习题入库
04
所属课程
02
筛选对象原则:
发现对象
2
3
从需求中找名词作为侯选对象:
教师,系统,习题,答案,作业,时间,学生,试题,系统管理员,权限,学校,班,学期,课程,习题板,考试板,练习本,习题库.
共18项
具体做法:
发现对象
系统:太大的抽象,不能作为对象.
时间:只有考试板要求,可作为考试板属性处理.
作业:是习题的同义词,可舍弃.
系统需求说明按三方面描述:
01
系统问题域说明:应用系统的业务范围
02
系统边界说明:确定系统与用户之间接口
03
系统功能说明:系统需要实现的责任
04
实例描述:习题管理系统
对象
系统问题域说明:
在一个公共习题库的支持下, 负责各科习题的教师: 可用系统编写习题及答案,并存入习题库; 从习题库中选择一组习题去组成作业,并在要求时间公布习题答案; 从习题库中选择一组习题组成考试题公布; 可以批改学生的作业; 学生答题后收卷,阅卷评分.
用系统完成作业或答题并提交给系统; 可在习题库中选择习题自己练习; 可以在公布答案后核对自己的作业;
每个学生:
负责习题,编班和权限管理和维护习题库.
一名系统管理员:
壹
贰
系统问题域说明:
系统的用户有本校教师,学生,系统管理员.
学校以班组织学生,每班每学期有若干课程.
面向对象软件开发事例3
OOA模型—评审者的检查表(续)
OOA 模 型层次 服务 命令约定 语 法 需 求 风 格 约 定
对初始参数层的分层 无‖外部‖访问 消息规格说明 过程描述记号与 至少一个类的服务 风格 至少一个实例的服务 服务与封装属性的一 致性 继承的一致性 类服务的一致性 存储数据的一致性 实例关系的一致性 服务-消息的一致性
好处:评审过程已成为开发过程的一部分。所 生成的管理报告可以监控、跟踪工程进度,保 证每一模型成分的质量。
OOA模型—评审者的检查表
OOA 模 命令约定 型层次 对象-类 唯一性 应用领域 形式 主题 唯一性 应用领域 形式 结构 唯一性 应用领域 形式 语 法 需 求 包含规则 事件识别器 事件响应器 风 格 约 定 响应性 信息封装 单个事件识别器 重载 独立性 包含所有对象-类 整体-部分,类属类 泛化-特化,继承 整体-部分,实例对 实例 重复度和参与度 泛化-特化,类对类 继承一致 唯一性 对初始属性层的分 应用领域 层属性规格说明 形式 (续)
现有的所有检查表都无法保证语义正确性,即 是否建立了‚正确的模型‛。 对语义正确性的评审采用的策略类似于在开发 面向用户的文档时采用的策略,将模型的行为 对照用户描述的场景或用户事例,一一加以确 认。 需要有关人员共同讨论,不一定举行正式的评 审会议。
检查语义正确性从事件-响应模型和EROI图入 手,走查每一个场景或事例,一步一步验证事 件如何识别,相关响应如何产生。
MVC模型
模型 视图
控制 器
我们的OOD体系结构与MVC结构类似,但增 加了一个成分:数据库管理部分。
3面向对象程序设计概述
对象
什么是对象(object)? 现实世界中的任何一 个事物都可以看成是一个对象。
自然的实体: 一个人, 一辆汽车, 一个教师 抽象的逻辑结构: 一个银行帐号, 一个学生的学籍档案 一条客户通信录
对象的广义定义和特性
对象是人们要研究的任何事物 ,其特性是: 1、每一个对象必须有一个名字以区别于其它对 象; 2、用属性(或叫状态)来描述它的某些特征; 3、有一组操作,每一个操作决定对象的一种行 为。
类的确定和划分
另外,还要知道什么事物不能被划分为类。不 能把一组函数组合在一起构成类,也就是说, 不能把面向过程的若干个函数简单组合变成类, 类不是函数的集合。
对象与类的关系
类是对一组性质相同的对象的描述。 对象则是类的具体化,是类的实例。 例如:“学生”是一个类,是对所有学生个体 的共同特征的描述,张三、李四等学生个体则 是学生类的实例。
面向对象程序设计
用程序中的对象直接模拟现实世界中的对象, 将问题空间直接映射到软件空间。从而设计出 尽可能直接、自然地表示问题求解方法的软件。 它把求解问题中客观存在的事物看作各自不同 的对象,再把具有相同特性的一些对象归属为 一个类。 面向对象的这种设计方式符合人类的自然思维 习惯,使我们能够在程序中自然地描述现实世 界的实体和问题,增强了程序代码的可读性, 有利于控制软件的复杂性。
面向服务的程序设计
软件由一组可互操作的服务组合而成。这些服 务既可以灵活组合在一起,也可以单独运行。 服务之间通过定义良好的接口和契约联系起来。 接口是采用中立的方式进行定义的,它应该独 立于实现服务的操作系统和编程语言。 服务的使用者通常使用一种代理机制来找到服 务提供者,因此它们之间是松耦合的。 面向服务的程序设计主要是考虑如何把服务拆 分开发,如何把服务组合运行。
面向对象ppt
1)实例构造函数的声明
语法形式:
[属性集信息] [构造函数修饰符] 标识符 ( [参数列表] ) [: base ( [参数列表] ) ] [: this ( [参数列表] ) ]
{
构造函数语句块 public 与类名相同 构造函数重载:
}
没有返回值 参数个数或类型不同
15
调用基类同参数列表的构造函数 调用本类同参数列表的构造函数
{
Radius=1.0;
// 通过构造函数对radius赋值
}
}
class Test
{
public static void Main( ) {
出错了!
Area s1 = new Area( );
//s1.Radius = 2;
无法修改只读字段
Console.WriteLine ("Radius={0},
其他特 VIP专享精彩活动
权
VIP专属身份标识
开通VIP后可以享受不定期的VIP随时随地彰显尊贵身份。
专属客服
VIP专属客服,第一时间解决你的问题。专属客服Q全部权益:1.海量精选书免费读2.热门好书抢先看3.独家精品资源4.VIP专属身份标识5.全站去广告6.名
using System;
public class Area
{
public readonly double Radius; // Radius是只读字段
private double x, y ;
public double Size ;
public static double Sum=0.0 ;
public Area ( )
Size={1},Sum={2}",s1.Radius,s1.Size , Area.Sum);
第三章 一个面向对象的C++程序实例
例如:一个圆类的定义(1)
class Circle :Public Point{ protected: int Radius; public: Circle (int InitX,int InitY,int InitRadius); void Show( ); void Hide( ); int GetRadius( ); };
3.1.2 面向对象分析 (4)
2.确定属性 圆的两个基本属性是圆心坐标和半径, 弧的基本属性有圆心坐标,半径,起始 角度和结束角度。不可能在需求陈述中 找到所有属性,还必须借助领域知识和 常识,才能分析得出所需要的全部属性。 圆和弧都应该再增加一个属性——可见 性
3.1.2 面向对象分析 (5)
3.1.3面向对象设计(2)
位置 坐标
点 可见性 显示 隐藏
圆 半径 显示 隐藏
弧 起始角度 结束角度 显示 隐藏 图3.2 简单图形程序的对象模型
3.1.3面向对象设计(3)
2.定义属性 所谓定义属性就是要确定每个属性的数据 类型和数据结构,同时还要确定每个属性的 访问权限(通常被定义在保护部分或私有部 分)。 3.定义服务 实现“显示”服务的算法概括来说就是, 把“可见性”属性设置为true,然后调用相应 的库函数用当前的前景颜色画出所要的图形。
3.1.2 面向对象分析 (6)
圆 圆心坐标 半径 可见性 读/写圆心坐标 读/写半径 读/写可见性 显示 隐藏 弧 圆心坐标 半径 起始角度 结束角度 可见性 读/写圆心坐标 读/写半径 读/写起始角度 读/写结束角度 读/写可见性 显示 隐藏
图3.1 圆类和弧类
3.1.3面向对象设计(1)
设计就是把通过分析得出的对程序的准确需求 转变成实现程序的方案的过程。主要完成下述 工作 : 1.建立类等级 面向对象程序的一个突出优点来源于继承性。 应该尽量抽取出相似类的公共属性和公共服务, 以建立这些相似类的父类,并在类等级的适当 层次中正确地定义各个属性和服务。 图3.2所示的对象 模型。为简明起见,图 中没有列出读/写属性值的常规服务。
03第三章面向对象基础
public static void main(String[] args)
{
Vehicle v;
//声明Vehicle类型的引用
v = new Vehicle(); //创建Vehicle类型的对象
v.speed = 100.0; //为速度赋值
v.power = 2;
//为马力赋值
v.speedUp(10);
一个人类的对象 属性 方法
姓名:张三 体重:50kg …… 密码:******
走路 吃饭 ……
可以公开 无所谓 不可以公开
继承
继承就是重用现有的类来生成新类的一种特 征;
通俗地讲就是从现有的类(即父类或基类) 创建新类(子类或派生类)的过程;
现实生活中,继承可以达到财产重用的目的, 而在Java中,继承可以使代码重用。
定义类的语法
成员变量
在类体中并且在方法之外定义的变量称为成员变 量。
[修饰符] 变量类型 变量名; 例如: double speed; int power = 2;
定义类的语法
1.访问控制权限 public、private及protecte、默认的(friendly)
2.静态变量修饰符 又被称为类变量,静态变量用关键字static表示。
//构造方法,根据传递进来的参数,为数据成员赋值
public Student(String n, int a, float w) {
//分别为每个数据成员赋初始值
name = n;
age = a;
weight = w;
}
public void setName(String n) {……} //为姓名赋值的方法,公有,代码略
引用名 = new 类名();
Java基础案例教程第3章 面向对象(上)
描述多个对象的共同特征,它是对象的模板
。对象用于描述现实中的个体,它是类的实 例。从图可以明显看出对象是根据类创
建的,并且一个类可以对应多个对象。
3.2 类与对象
类的定义
在面向对象的思想中最核心的就是对象,为了在程序中创建对象,
超市购物程序设计
构造方法
☞点击查看本小节知识架构
this关键字
垃圾回收 static关键字
☞点击查看本小节知识架构
成员内部类
银行新用户现金业务办理
3.1 面向对象的概念
面向对象是一种符合人类思维习惯的编程思想。现实生活中存在各种形态 不同的事物,这些事物之间存在着各种各样的联系。在程序中使用对象来 映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就
是面向对象。
提到面向对象,自然会想到面向过程,面向过程就是分析出解决问题所需 要的步骤,然后用函数把这些步骤一一实现,使用的时候依次调用就可以
了。面向对象则是把构成问题的事务按照一定规则划分为多个独立的对象,
然后通过调用对象的方法来解决问题。当然,一个应用程序会包含多个对 象,通过多个对象的相互配合来实现应用程序的功能,这样当应用程序功 能发生变动时,只需要修改个别的对象就可以了,从而使代码更容易得到 维护。面向对象的特点主要可以概括为封装性、继承性和多态性,接下来 针对这三种特性进行简单介绍。
例如,创建Person类的实例对象代码如下:
上面的代码中,“new Person()”用于创建Person类的 一个实例对象,“Person p”则是声明了一个Person类型 的变量p。中间的等号用于将Person对象在内存中的地址 赋值给变量p,这样变量p便持有了对象的引用。在内存 中变量p和对象之间的引用关系如右图所示。
第3章补充案例
案例
一、案例描述
1、考核知识点
编号:2
名称:类和对象
2、练习目标
掌握类定义的方式
掌握如何在类中定义成员变量和成员方法
3、需求分析
在面向对象的思想中最核心就是对象,在程序中创建对象的前提是需要定义一个类。为了让初学者掌握类的定义方式,本案例将设计一个表示学生的类,该类具有表示姓名的属性name和表示年龄的属性age,同时还具有表示说话行为的方法speak(),用于输出学生的姓名和年龄。
}else{
age =a;
}
}
void speak() {
System.out.println("我的名字是" + name + ",今年" + age + "岁");
}
}
public class Example02{
public static void main(String[] args) {
Student s1 = new Student();
4、设计思路(实现原理)
1)编写测试类Example02,将属性age的值设为-30,演示不合理现象。
2)对Student类进行修改,将name和age属性使用private修饰,然后定义getName()、setName(String n)、getAge()和setAge(int a)四个对外访问name和age的方法。
图3-5运行结果
从运行结果可以看出,由于实现了Division类的封装,在setDivisor(int mDivision)方法中对传入的值进行检查,从而避免程序中出现除数为0的错误。
案例
一、案例描述
面向对象案例分析
案例分析:《图书馆管理系统》一.系统描述:图书馆管理系统使对书记的借阅即读者信息进行统一管理的系统,具体包括读者的借书、还书、书籍订阅;图书馆管理员的书籍借出处理、书籍归还处理、预订信息处理;还有系统管理员的系统维护,包括增加书目、删除或更新书目、增加书籍、减少书籍、增加读者帐户信息、删除或更新读者帐户信息、书籍信息查询、读者信息查询等。
系统的总体信息确定以后,就可以分析系统的参与者、确定系统用例了。
二.确定系统的参与者:确定系统参与者首先需要分析系统所涉及的问题领域和系统运行的主要任务:分析使用该系统主要功能的是哪些人,谁需要该系统的支持以完成其工作,还有系统的管理者与维护者。
根据图书馆管理系统的需求分析,可以确定如下几点:✧作为一个图书馆管理系统,首先需要读者(借阅者)的参与,读者可以登录系统查询所需要的书籍,查到所需书籍后可以考虑预订,当然最重要的是借书、还书操作;✧对于系统来说,读者发起的借书、还书等操作最终还需要图书馆管理员来处理,他们还可以负责图书的预订和预订取消;✧对于图书馆管理系统来说,系统的维护操作也是相当重要的,维护操作主要包括增加书目、删除或更新书目、增加书籍、减少书籍等操作。
由以上分析可以得出,系统的参与者主要有3类:读者(借阅者)、图书馆管理员、图书馆关系系统维护者。
三.确定系统用例:1.借阅者请求服务的用例:1)登录系统;2)查询自己的借阅信息;3)查询书籍信息;4)预订书籍;5)借阅书籍;6)归还书籍。
2.图书馆管理员处理借书、还书等的用例:1)处理书籍借阅;2)处理书籍归还;3)删除预订信息。
3.系统管理员进行系统维护的用例:1)查询借阅者信息;2)查询书籍信息;3)增加书目;4)删除或更新书目;5)增加书籍;6)删除书籍;7)增加借阅者帐户;8)删除或更新借阅者帐户。
四.用例图:1)借阅者请求服务的用例:2)图书馆管理员处理借书、还书等的用例:3)系统管理员进行系统维护的用例:补充案例:《订货中心系统》一.系统简介:有这样一个订货中心,它接受客户的电话、传真、电子邮件、信件和web 主页表单形式的订货请求,形成货物订单,并告知客户订单的价钱。
第3章补充案例教学教材
1、定义Example02类,代码如下所示:
public class Example02{
public static void main(String[] args) {
Student s1 = new Student();
= "小新";
s1.age = -30;
s1.speak();
double price;
void call(){
System.out.println("hi,how are you doing述
1、考核知识点
编号:00103003
名称:对象创建与使用
2、练习目标
掌握如何创建类的对象
掌握如何使用两个或者多个变量引用同一个实例对象。
3、需求分析
3)在setAge(int a)方法中对传入的参数进行检查,如果输入值为负数,则打印出“设置的年龄不合法”,如果不为负数,才将其设置为age属性的值。
4)对Example02类进行修改,在main()方法中创建Student类的实例对象,通过调用对象的setName(String n)和setAge(int a)方法来设置的name属性和age属性值,并调用speak()方法。
第3章补充案例
第
案例
一、案例描述
1、考核知识点
编号:00103002
名称:类和对象
2、练习目标
掌握类定义的方式
掌握如何在类中定义成员变量和成员方法
3、需求分析
在面向对象的思想中最核心就是对象,在程序中创建对象的前提是需要定义一个类。为了让初学者掌握类的定义方式,本案例将设计一个表示学生的类,该类具有表示姓名的属性name和表示年龄的属性age,同时还具有表示说话行为的方法speak(),用于输出学生的姓名和年龄。
第3章 面向对象(上)_补充案例
v1.0 可编辑可修改第三章补充案例案例3-1 定义学生类一、案例描述1、考核知识点编号:00103002名称:类和对象2、练习目标掌握类定义的方式掌握如何在类中定义成员变量和成员方法3、需求分析在面向对象的思想中最核心就是对象,在程序中创建对象的前提是需要定义一个类。
为了让初学者掌握类的定义方式,本案例将设计一个表示学生的类,该类具有表示姓名的属性name和表示年龄的属性age,同时还具有表示说话行为的方法speak(),用于输出学生的姓名和年龄。
4、设计思路(实现原理)1)使用class关键字定义一个表示学生类型的类,类名为Student。
2)在Student类中定义两个成员变量name和age,分别用来表示姓名和年龄。
其中,name的数据类型为String,变量age的数据类型为int。
3)在Student类中定义一个表示说话行为的speak()方法,用于输出学生的姓名和年龄。
二、案例实现class Student{String name;int age;1void speak() {"我的名字是 "+name+",今年 "+age+"岁");}}三、案例总结1、Java语言严格区分大小写,class和Class是不同的,在定义类时只能使用class关键字2、在Student类中,成员变量name是String类型,String表示一个字符串,后面的章节会详细讲解3、思考一下:自己定义一个手机(Phone)类,在类中定义品牌(brand)和价格(price)属性,定义打电话的call()方法,代码如下所示public class Phone {String brand;double price;void call(){"hi,how are you doing");}}案例3-2 同一对象被多个变量引用一、案例描述1、考核知识点编号:00103003名称:对象创建与使用2、练习目标2掌握如何创建类的对象掌握如何使用两个或者多个变量引用同一个实例对象。
C#程序设计第3章面向对象的程序设计
}
Student stu2=new Student();
3.3类与对象
3.4.1类的定义 在程序中,类是具有相同属性的对象的集合与抽象。它是一
个创建现实对象的模板。 对象是类的具体实例。类实际 上也可以看做是自己定义的数据类型。
3.3类与对象
3.4.1类的定义 在类声明中需要使用关键字class,其简单的定义格式为:
class 类名 {
//类体 } 其中,类体是以一对大括号开始和结束的,在一对大括号后 面可以跟一个分号,也可以省略分号;类体中的成员种类 较多,常见的有字段、属性、方法等;类的所有成员的声 明均需在类体中。
3.4 字段与属性
例3-5:创建两个Student对象,访问对 象中的属性。
namespace ch3_5 {
public class Student {
/// <summary> /// 姓名字段 /// </summary> private string name; /// <summary> /// 姓名属性 /// </summary> public string Name {
3.4 字段与属性
3.4.1 字段的定义 字段是类成员中最基础也较重要的一个成员,是与对象或类
相关联的变量。其作用主要是用于保存与类有关的一些数 据。它的声明格式与普通变量的声明格式基本相同,声明 位置没有特殊要求,习惯上将字段说明放在类体中的最前 面。 定义字段的基本格式为: [访问修饰符] 数据类型 字段名
get { return name; } set { name = value; }
/// <summary> /// 学号字段 /// </summary> private string id; /// <summary> /// 学号属性 /// </summary> public string Id { get { return id; } set { id = value; } } /// <summary> /// 电话号码字段 /// </summary> private string phone; /// <summary> /// 电话号码属性
面向对象软件开发事例1
建立OOA模型的任务
形式地说明我们所面对的应用问题,最终成为 软件系统基本构成的对象,还有系统所必须遵 从的,由应用环境所决定的规则和约束。 明确地规定构成系统的对象如何协同合作,完 成指定的功能。这种协同在模型中是以一组消 息连接来表示的,它们承担了各个对象之间的 通信。
构造OOA模型的层次
什么是类和实例?
把具有相同特征和行为的对象归在一起就形成 了类(class) 。
李杰 属性 李杰 男 广东 软件 1988.4 9#楼129室 服务 看书 实验 吃饭 睡觉 王辉 属性 王辉 男 湖南 计算机控制 1989.1 9#楼320室 服务 看书 实验 吃饭 睡觉 杨芳 属性 杨芳 女 北京 系统结构 1989.12 5#楼418室 服务 看书 实验 吃饭 睡觉 学生 属性 姓名 性别 籍贯 专业 出生年月 住址 服务 看书 实验 吃饭 睡觉
易增加新类 只须描述不同部分
怎样建立一个好的继承层次
类可以从父类继承,父类又可以从它的父类 继承,形成多层次的继承结构。
当增加一个新类时,不一定在最低层,可能 需要插在中间层,这样可能需要调整原来的 层次结构。
汽车
大轿车
运货车
救火车
起重车
现要建立一个新类起重车。它的 底盘、发动机、轮胎、驱动装置 等都在既存类汽车中。关系如右 图所示。新类是既存类的特殊情 形。这时直接让起重车类作为汽 车类的子类即可。
同一概念在不同应用领域中抽象出来的基本构 造块是不同的。
一个典型的软件开发生存期
t
工作产品与里程碑
需求定义 模型
分析模型
设计模型
实现模型
C++第一讲——面向对象的简单设计方法及示例PPT教学课件
发现对象及其属性、行为定义
1.2 从系统责任发现对象 通过对问题领域的考虑,发现了许多对象,但是
可能还存在一些疏漏。通过考虑系统的责任可以检查 所存在的疏漏,发现遗漏的对象。可能无法从问题领 域中找到相应的对象来提供系统责任所要求的某些功 能(例如系统安装、配置、数据信息备份等),这说明我 们遗漏了对象,此时就必须按照系统责任所要求的每 一项功能,查看是否有相应的对象来实现,如果没有 就可以考虑增加一些对象来实现这些功能。
发现对象及其属性、行为定义
2.3 本问题领域中的属性 对象的有些属性,只有通过认真地研究当前问题
发现对象及其属性、行为定义
面向对象的简单设计方法及示例
1 怎样发现对象 2 定义属性 3 确定行为 4 C++编程
发现对象及其属性、行为定义
1 怎样发现对象Байду номын сангаас
我们在这里谈发现对象,是基于面向对象的基础 之上的。重点是在面向对象程序设计中如何去识别对 象。在面向对象程序设计中,问题域和系统责任是发 现对象的出发点。二者从不同的角度告诉分析员应该 设立哪些对象。前者侧重于客观存在的事物与系统中 对象的映射;后者侧重于系统责任范围内的每一个职 责都应落实到某些对象来完成。
发现对象及其属性、行为定义
(3) 推迟到OOD考虑的对象。候选对象中那些与具 体的实现条件密切相关的对象,如图形用户界面(GUI) 系统、数据管理系统、硬件及操作系统有关的对象应 该推迟到OOD阶段考虑,不要在OOA模型中建立这些 对象,这样可使OOA模型独立于具体的实现环境而只 与问题域有关。
上面已经为大家介绍了发现对象的方法,下面用 具体的例子实现上述方法。
发现对象及其属性、行为定义
public: float Average(int n);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三章补充案例案例3-1 定义学生类一、案例描述1、考核知识点编号:2名称:类和对象2、练习目标➢掌握类定义的方式➢掌握如何在类中定义成员变量和成员方法3、需求分析在面向对象的思想中最核心就是对象,在程序中创建对象的前提是需要定义一个类。
为了让初学者掌握类的定义方式,本案例将设计一个表示学生的类,该类具有表示姓名的属性name和表示年龄的属性age,同时还具有表示说话行为的方法speak(),用于输出学生的姓名和年龄。
4、设计思路(实现原理)1)使用class关键字定义一个表示学生类型的类,类名为Student。
2)在Student类中定义两个成员变量name和age,分别用来表示姓名和年龄。
其中,name的数据类型为String,变量age的数据类型为int。
3)在Student类中定义一个表示说话行为的speak()方法,用于输出学生的姓名和年龄。
二、案例实现class Student{String name;int age;void speak() {System.out.println("我的名字是 "+name+",今年 "+age+"岁");}}三、案例总结1、Java语言严格区分大小写,class和Class是不同的,在定义类时只能使用class关键字2、在Student类中,成员变量name是String类型,String表示一个字符串,后面的章节会详细讲解3、思考一下:自己定义一个手机(Phone)类,在类中定义品牌(brand)和价格(price)属性,定义打电话的call()方法,代码如下所示public class Phone {String brand;double price;void call(){System.out.println("hi,how are you doing");}}案例3-2 同一对象被多个变量引用一、案例描述1、考核知识点编号:名称:对象创建与使用2、练习目标➢掌握如何创建类的对象➢掌握如何使用两个或者多个变量引用同一个实例对象。
3、需求分析在程序中,一个对象可能在多处使用,这样就可能需要有多个变量来引用这个对象。
为了让初学者更好地掌握对象的创建和使用,本案例将基于案例3-1,创建三个学生对象,它们的引用变量分别是s1、s2和s3,首先分别使用s1和s2引用,为name和age赋值,然后调用speak()方法,最后将s2变量赋值给s3,s3也调用speak()方法。
4、设计思路(实现原理)1)编写Example01类2)在main()方法中,创建Student类的第一个对象,其引用变量为s1,使用s1调用name和age 变量分别为它们赋值为“张三”和“19”,然后调用speak()方法。
3)创建Student类的第二个对象,其引用变量为s2,使用s2分别为name和age赋值为“李四”和“20”,然后调用speak()方法。
4)创建Student类的第三个对象,其引用变量为s3,将s2的值赋给s3,然后使用s3调用speak()方法。
二、案例实现public class Example01 {public static void main(String [] args) {Student s1 = new Student();="张三";s1.age=19;s1.speak();Student s2 = new Student();="李四";s2.age=20; s2.speak();Student s3 = new Student(); s3=s2;s3.speak();}}运行结果如图3-1所示。
图3-1 运行结果三、案例总结1、Student s3 = s2这句代码的作用是将s2引用的内存地址赋值给s3,换句话说,就是使变量s3和s2引用了同一个Student 对象,因此s3.speak()方法和s2.speak()方法打印的结果相同。
为了更加深刻地了解这句代码的含义,下面通过一张内存图来演示,具体如图3-2所示。
new Student()s1内存name=张三age=19speak()s2name=李四age=20speak()new Student()s3图3-2 内存图2、可以使用两个或者多个变量引用同一个实例对象,只要通过其中一个变量对该对象的属性进行修改,使用其它引用变量访问时,访问的都是修改后的属性。
案例3-3 类的封装 一、案例描述1、 考核知识点编号:名称:类的封装2、练习目标➢了解为什么要对类进行封装➢了解如何实现类的封装3、需求分析在案例3-2中,s1对象的年龄是可以随便赋值的,如果将age的值赋值为-30,显然违背了事实。
为了解决这类问题,我们需要对类进行封装,防止外界对类中的成员变量随意访问。
为了让初学者更好地掌握类的封装,本案例将使用private关键字对成员变量name和age进行私有化,同时分别提供一个setName(String n)和setAge(int a)方法用于外界的访问,其中setAge(int a)中需要对age进行判断。
4、设计思路(实现原理)1)编写测试类Example02,将属性age的值设为-30,演示不合理现象。
2)对Student类进行修改,将name和age属性使用private修饰,然后定义getName()、setName(String n)、getAge()和setAge(int a)四个对外访问name和age的方法。
3)在setAge(int a)方法中对传入的参数进行检查,如果输入值为负数,则打印出“设置的年龄不合法”,如果不为负数,才将其设置为age属性的值。
4)对Example02类进行修改,在main()方法中创建Student类的实例对象,通过调用对象的setName(String n)和setAge(int a)方法来设置的name属性和age属性值,并调用speak()方法。
二、案例实现1、定义Example02类,代码如下所示:public class Example02 {public static void main(String[] args) {Student s1 = new Student(); = "小新";s1.age = -30;s1.speak();}}运行结果如图3-3所示。
图3-3运行结果从上图可以看出,当将age的值设置为-30后,程序不会报错,但却违背了现实。
2、对Student类进行封装,其代码如下:class Student {private String name = "张三";private int age = 19;public String getName() {return name;}public void setName(String n) {name = n;}public int getAge() {return age;}public void setAge(int a) {// 对传入的参数进行检查if(a < 0){System.out.println("设置的年龄不合法");}else{age = a;}}void speak() {System.out.println("我的名字是" + name + ",今年" + age + "岁");}}public class Example02 {public static void main(String[] args) {Student s1 = new Student();s1.setName("小新");s1.setAge(-30);s1.speak();}}运行结果如图3-4所示。
图3-4运行结果三、案例总结1、Student的name和age属性使用private关键字修饰为私有后,在Example02类中不能再使用 和s1.age的方式访问这两个属性,只能通过public类型的setName(String n)和setAge(int a)方法进行访问。
在上面的代码中,调用setAge(int a)方法时的传入参数为-30,由于参数小于0,会打印出“设置的年龄不合法”,并不会将负数赋值给age属性。
由此可见,只要实现了封装就能对外界的访问进行控制,避免对私有变量随意修改而引发问题。
2、思考一下:定义一个Division类(除法),类中定义两个int类型的私有成员变量dividend(被除数)和divisor(除数),默认值都为1。
定义四个公有方法setDividend(int mDividend )、getDividend()、setDivisor(int mDivisor)和getDivisor(),用于对私有属性进行设置和访问。
在setDivisor(int mDivisor)方法中对传入的参数进行检查,如果传入值为零,则打印“除数不能为零”,如果不为零,才将其设置为divisor属性的值。
定义Example03类,在类的main()方法中创建Division对象,分别调用setDividend(int mDividend)和setDivisor(int mDivisor)方法给两个私有属性dividend和divisor赋值,然后打印出dividend和divisor的结果。
(1)定义Division类,代码如下所示:public class Division {private int dividend = 1;private int divisor = 1;public void setDividend(int mDividend) {dividend = mDividend;}public int getDividend() {return dividend;}public void setDivisor(int mDivisor) {if (mDivisor == 0) {System.out.println("除数不能为零");} else {divisor = mDivisor;}}public int getDivisor() {return divisor;}}(2)定义Example03类,代码如下所示:public class Example03{public static void main(String[] args) {Division division = new Division();division.setDividend(10);division.setDivisor(0);int dividend = division.getDividend();int divisor = division.getDivisor();System.out.println(dividend / divisor);}}运行结果如图3-5所示。