第3章-面向对象(上)-补充案例

合集下载

第03章 一个面向对象的C++程序实例

第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

面向对象软件开发事例3

OOA模型—评审者的检查表(续)
OOA 模 型层次 服务 命令约定 语 法 需 求 风 格 约 定
对初始参数层的分层 无‖外部‖访问 消息规格说明 过程描述记号与 至少一个类的服务 风格 至少一个实例的服务 服务与封装属性的一 致性 继承的一致性 类服务的一致性 存储数据的一致性 实例关系的一致性 服务-消息的一致性


好处:评审过程已成为开发过程的一部分。所 生成的管理报告可以监控、跟踪工程进度,保 证每一模型成分的质量。
OOA模型—评审者的检查表
OOA 模 命令约定 型层次 对象-类 唯一性 应用领域 形式 主题 唯一性 应用领域 形式 结构 唯一性 应用领域 形式 语 法 需 求 包含规则 事件识别器 事件响应器 风 格 约 定 响应性 信息封装 单个事件识别器 重载 独立性 包含所有对象-类 整体-部分,类属类 泛化-特化,继承 整体-部分,实例对 实例 重复度和参与度 泛化-特化,类对类 继承一致 唯一性 对初始属性层的分 应用领域 层属性规格说明 形式 (续)

现有的所有检查表都无法保证语义正确性,即 是否建立了‚正确的模型‛。 对语义正确性的评审采用的策略类似于在开发 面向用户的文档时采用的策略,将模型的行为 对照用户描述的场景或用户事例,一一加以确 认。 需要有关人员共同讨论,不一定举行正式的评 审会议。



检查语义正确性从事件-响应模型和EROI图入 手,走查每一个场景或事例,一步一步验证事 件如何识别,相关响应如何产生。
MVC模型
模型 视图
控制 器

我们的OOD体系结构与MVC结构类似,但增 加了一个成分:数据库管理部分。

3面向对象程序设计概述

3面向对象程序设计概述

对象

什么是对象(object)? 现实世界中的任何一 个事物都可以看成是一个对象。
自然的实体: 一个人, 一辆汽车, 一个教师 抽象的逻辑结构: 一个银行帐号, 一个学生的学籍档案 一条客户通信录
对象的广义定义和特性
对象是人们要研究的任何事物 ,其特性是: 1、每一个对象必须有一个名字以区别于其它对 象; 2、用属性(或叫状态)来描述它的某些特征; 3、有一组操作,每一个操作决定对象的一种行 为。
类的确定和划分

另外,还要知道什么事物不能被划分为类。不 能把一组函数组合在一起构成类,也就是说, 不能把面向过程的若干个函数简单组合变成类, 类不是函数的集合。
对象与类的关系


类是对一组性质相同的对象的描述。 对象则是类的具体化,是类的实例。 例如:“学生”是一个类,是对所有学生个体 的共同特征的描述,张三、李四等学生个体则 是学生类的实例。
面向对象程序设计


用程序中的对象直接模拟现实世界中的对象, 将问题空间直接映射到软件空间。从而设计出 尽可能直接、自然地表示问题求解方法的软件。 它把求解问题中客观存在的事物看作各自不同 的对象,再把具有相同特性的一些对象归属为 一个类。 面向对象的这种设计方式符合人类的自然思维 习惯,使我们能够在程序中自然地描述现实世 界的实体和问题,增强了程序代码的可读性, 有利于控制软件的复杂性。
面向服务的程序设计




软件由一组可互操作的服务组合而成。这些服 务既可以灵活组合在一起,也可以单独运行。 服务之间通过定义良好的接口和契约联系起来。 接口是采用中立的方式进行定义的,它应该独 立于实现服务的操作系统和编程语言。 服务的使用者通常使用一种代理机制来找到服 务提供者,因此它们之间是松耦合的。 面向服务的程序设计主要是考虑如何把服务拆 分开发,如何把服务组合运行。

面向对象ppt

面向对象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++程序实例

第三章  一个面向对象的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第三章面向对象基础

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章 面向对象(上)

Java基础案例教程第3章 面向对象(上)
玩具看作对象,从玩具模型和玩具之间的关 系便可以看出类与对象之间的关系。类用于
描述多个对象的共同特征,它是对象的模板
。对象用于描述现实中的个体,它是类的实 例。从图可以明显看出对象是根据类创
建的,并且一个类可以对应多个对象。
3.2 类与对象
类的定义
在面向对象的思想中最核心的就是对象,为了在程序中创建对象,
超市购物程序设计
构造方法
☞点击查看本小节知识架构
this关键字
垃圾回收 static关键字
☞点击查看本小节知识架构
成员内部类
银行新用户现金业务办理
3.1 面向对象的概念
面向对象是一种符合人类思维习惯的编程思想。现实生活中存在各种形态 不同的事物,这些事物之间存在着各种各样的联系。在程序中使用对象来 映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就
是面向对象。
提到面向对象,自然会想到面向过程,面向过程就是分析出解决问题所需 要的步骤,然后用函数把这些步骤一一实现,使用的时候依次调用就可以
了。面向对象则是把构成问题的事务按照一定规则划分为多个独立的对象,
然后通过调用对象的方法来解决问题。当然,一个应用程序会包含多个对 象,通过多个对象的相互配合来实现应用程序的功能,这样当应用程序功 能发生变动时,只需要修改个别的对象就可以了,从而使代码更容易得到 维护。面向对象的特点主要可以概括为封装性、继承性和多态性,接下来 针对这三种特性进行简单介绍。
例如,创建Person类的实例对象代码如下:
上面的代码中,“new Person()”用于创建Person类的 一个实例对象,“Person p”则是声明了一个Person类型 的变量p。中间的等号用于将Person对象在内存中的地址 赋值给变量p,这样变量p便持有了对象的引用。在内存 中变量p和对象之间的引用关系如右图所示。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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所示。

相关文档
最新文档