对象与类
🔥 9/26 套 · 近年 2/12对象由对象名、属性、操作三部分组成,封装了数据和行为;状态是对象全部属性及其当前值。类是一组对象的抽象定义,一个类可以产生多个对象,同类对象共享属性和行为;对象之间靠消息通信。
易错“消息是对象的组成部分”是错的;类的静态数据成员归类所有、被所有对象共享,它的值可以修改。
怎么记对象 = 名字 + 数据 + 能做的事;类是做对象的模子。
D4 里要死记的内容都在这一页:6 组考点、40 张卡片和表,每组都标了考频,最后一组是晚间的新技术速读。下午试题三怎样补类名、补参与者和用例,一步一张图的推法在配套的技巧图解里。
对象与类 · 封装 · 继承 · 多态 · 绑定 · 重载与覆盖
| 概念 | 一句话 | 真题这样问 |
|---|---|---|
| 对象 | 由对象名、属性、操作组成;对象的状态= 全部属性及其当前值 | 标识对象所有属性及当前值的是“状态”(18上·37) |
| 类 | 一组对象的抽象定义;一个类可以产生多个对象 | 成员变量和成员函数又叫属性和方法(19下·37) |
| 封装 | 数据和行为绑在一起,对使用者隐藏细节(信息隐藏) | private 成员只有本类中定义的方法能访问(17下·38) |
| 继承 | 父类和子类共享数据和方法的机制,在已有类的基础上创建新类 | 子类可以有新的属性和行为(17下·39) |
| 多态 | 不同对象收到同一消息,产生完全不同的结果 | “支持多态的是”选动态绑定(16下·38) |
| 覆盖 | 子类用适合自己的实现置换父类的同名方法 | 和“重载”区分开(16上·38) |
对象由对象名、属性、操作三部分组成,封装了数据和行为;状态是对象全部属性及其当前值。类是一组对象的抽象定义,一个类可以产生多个对象,同类对象共享属性和行为;对象之间靠消息通信。
易错“消息是对象的组成部分”是错的;类的静态数据成员归类所有、被所有对象共享,它的值可以修改。
怎么记对象 = 名字 + 数据 + 能做的事;类是做对象的模子。
封装把逻辑上相关的数据和行为绑成一个单元,尽可能隐藏内部细节,是一种信息隐藏技术,目的是让对象的使用者和生产者分离。
易错类里设成 private 的属性和方法,只有本类中定义的方法可以访问;封装不是“接口管理”,也不是多态。
怎么记像银行卡:卡里怎么记账看不见,只能用存款、取款这几个按钮。
继承是父类和子类之间共享数据和方法的机制,用来在已有类的基础上创建新类;子类可以新增属性和行为,也可以定义和父类同名的操作来覆盖它。一个类有两个以上的父类叫多重继承,可能让子类里的成员出现二义性。
易错“只允许单重继承”“子类不能定义与父类同名的操作”都是错的。
怎么记一般和特殊的关系就是泛化:“汽车是一种交通工具”。
不同对象收到同一消息产生不同的结果,就是多态,客户类不用知道具体子类怎么实现。通用多态:参数多态(最纯的多态)、包含多态(子类型化);特定多态:过载多态(同名操作在不同上下文里含义不同)、强制多态(类型自动转换)。
补充问“由什么机制支持”选继承,问“支持多态的实现机制”选动态绑定;子类对象可以当父类对象用,反过来不行。
怎么记通用多态对很多类型都成立(参数、包含);特定多态只对少数几个类型(过载、强制)。
绑定是把过程调用和响应调用要执行的代码结合起来。编译时结合是静态绑定;运行时(调用发生时)才结合是动态绑定。动态绑定是实现多态的基础。
补充强类型、弱类型、过载绑定、动态分配都是干扰项。
怎么记编译时定死是静态,跑起来再定是动态。
重载:同一个类里,名字相同而参数表不同(类型、个数或顺序)的多个方法。覆盖(重置、重写):子类在父类接口的基础上,用适合自己的实现置换父类的同名方法。
补充类图里子类又写出父类已有的方法名,就是覆盖;没写出来,就是直接继承。
怎么记重载横着比(同一个类里),覆盖竖着比(父类和子类)。
实体类:现实世界里的人和物,保存信息,比如客户、订单;边界类(接口类):系统和用户、外部系统交互的方式,比如窗口、二维码、条形码;控制类:协调实体类和边界类的活动流。
易错二维码、条形码是边界类(接口类),不是实体类。
怎么记存东西的、对外接触的、居中调度的。
先在心里说出答案,再点开核对。
父类和子类共享数据和方法的机制是继承;子类用自己的实现置换父类的同名方法,叫覆盖(重置)。封装是隐藏细节,多态是同一消息产生不同结果。
五种关系从松到紧 · 聚合还是组合 · 多重度 · 关联类
下午试题三和明天的设计模式都要读类图。先把每种关系的画法和“绑得有多紧”对上号。
为什么是这个顺序:两个类绑得越来越紧——临时用一下 → 长期认识 → 拥有但能分开 → 拥有而且同生共死 → 干脆就是它的一种。
易错聚合和组合都是关联的特例;“实现”(虚线 + 空心三角,指向接口)是类和接口之间的关系,不在这条阶梯上。
按“一个 X 对应几个 Y”,把数字标在 Y 那一端。
| 写法 | 意思 |
|---|---|
| 1 | 恰好 1 个 |
| 0..1 | 0 个或 1 个 |
| * 或 0..* | 任意多个,可以没有 |
| 1..* | 至少 1 个 |
| m..n | m 到 n 个 |
看部分能不能离开整体单独存在:能,就是聚合(空心菱形),比如汽车和轮胎、班级和学生;不能,整体没了部分也没了,就是组合(实心菱形),比如订单和订单明细、人和心脏。组合里删除整体,部分随之删除;反过来删除部分,整体不受影响。
易错删除部分一端的对象,不会导致整体一端的对象被删除。
怎么记能拆下来装到别处的是聚合,拆下来就没意义的是组合。
两个类多对多,而且要记录联系本身的信息——比如哪位医生、哪天哪个时间治疗了哪位病人——就建一个关联类,用虚线连到关联线上。
补充“汽车和座位”“部门和员工”不需要单独建类,“医生和病人”需要(19下·38)。
怎么记联系本身也有属性时,就给它单独建一个类。
UML 的接口声明对象类需要的服务,由实现类来完成;类和接口之间是实现关系,画成虚线 + 空心三角,三角指向接口。
易错泛化是实线 + 空心三角,实现是虚线 + 空心三角,别混。
先在心里说出答案,再点开核对。
医生和病人是多对多,而且要记录每次诊治的信息(日期、时间),这种联系要单独建一个关联类;另外三组用普通的关联或聚合就够了。
七个类设计原则 · 三个包设计原则
| 原则 | 一句话 | 真题描述里的关键词 |
|---|---|---|
| 单一职责 | 一个类只负责一件事 | “仅有一个引起它变化的原因” |
| 开闭(开放-封闭) | 对扩展开放,对修改关闭 | “可以扩展但不可修改”(19下·39) |
| 里氏替换 | 子类对象能替换父类对象 | “基类对象出现的地方,子类对象一定可以出现” |
| 依赖倒置 | 依赖抽象,不依赖具体实现 | “依赖于抽象而不是实现” |
| 接口隔离(接口分离) | 接口要小而专 | “不强迫客户依赖他们不用的方法” |
| 组合/聚合复用 | 复用时优先用组合或聚合,少用继承 | |
| 迪米特(最少知识) | 只和直接的朋友通信 | “对其他对象知道得越少越好” |
易错题干里同时出现“依赖于抽象”,但核心说的是“不强迫客户依赖不用的方法”时,选接口隔离。
| 原则 | 一句话 |
|---|---|
| 共同重用 | 重用了包中的一个类,就要重用包中的所有类(21下·38) |
| 共同封闭 | 包中的类对同一类性质的变化共同封闭:一个变化影响这个包,就影响包里所有的类 |
| 无环依赖 | 包的依赖关系图中不允许存在环(22上·17) |
就一个类而言,应该仅有一个引起它变化的原因:一个类只做一件事。
怎么记一把螺丝刀比一把什么都能干的瑞士军刀好维护。
软件实体(类、模块、函数等)应该对扩展开放、对修改关闭:加功能靠新增代码,不改已经写好的代码。
怎么记新功能插进来,旧代码锁起来。
基类对象可以出现的地方,子类对象一定可以出现:子类必须能替换父类,而且不改变程序的正确性。
怎么记能放“鸟”的位置,放麻雀、燕子都不出错。
高层模块和低层模块都应该依赖抽象(接口、抽象类),而不是依赖具体实现:抽象不依赖细节,细节依赖抽象。
怎么记业务逻辑只认“存储”这个接口,底下换成哪种数据库,它都不用改。
不强迫客户依赖它们不用的方法:与其做一个大而全的接口,不如拆成几个小而专的接口。
易错题干同时有“依赖于抽象”时别被带偏:重点是“不强迫依赖不用的方法”,就选接口隔离。
怎么记一百个按钮的万能遥控器,不如电视、空调各配一个。
复用已有功能时,优先通过组合或聚合把已有的对象拼进来,少用继承。
怎么记汽车装上发动机、轮子、座椅就能跑,不必去“继承”一台发动机。
一个对象应当对其他对象有尽可能少的了解:只和直接的朋友通信,不和“陌生人”说话。也叫最少知识原则。
怎么记有事请朋友转达,不直接去找朋友的朋友。
共同重用:重用包里一个类,就要重用包里所有的类;共同封闭:包里的类对同一类性质的变化共同封闭;无环依赖:包之间的依赖关系不能成环。
易错“重用一个类就要重用全包”是共同重用,不是共同封闭。
怎么记包也讲究:一起用、一起变、不绕圈。
先在心里说出答案,再点开核对。
包里的类应该一起被重用:用了其中一个,就要用全部,这是共同重用原则。共同封闭说的是包里的类对同一类变化共同封闭。
OOA 做什么 · OOD 怎么做 · 测试四层
| 回答什么 | 主要活动 | |
|---|---|---|
| OOA 面向对象分析 | 做什么:理解问题,建立独立于实现的问题域模型,不考虑实现和测试 | 认定对象(从需求描述里选名词短语)→ 组织对象 → 描述对象间的相互作用 → 确定对象的操作 |
| OOD 面向对象设计 | 怎么做:以 OOA 的结果为依据,要考虑实现细节 | 识别类及对象 → 定义属性 → 定义服务 → 识别关系 → 识别包 |
| OOP 面向对象程序设计 | 用面向对象语言实现 | 面向对象程序设计语言为面向对象的实现服务(22上·19) |
易错22上·18 问 OOA 的第一项活动,答“认定对象”(11上 有一道问 OOA 的第一步,资料答案是“确定问题域”);“OOD 不关注实现细节”“OOA 要考虑测试”“OOD 先于 OOA”都是错的;面向对象程序设计不属于 OOA 的活动(16下·39)。
分析看问题:建立独立于实现的模型,关注系统的行为;设计看方案:以分析的结果为依据,考虑实现细节。分析阶段从需求描述里选名词短语来识别对象。
怎么记先弄清“做什么”,再决定“怎么做”。
算法层:测试类中定义的每个方法,相当于单元测试;类层:测试同一个类里方法和属性的相互作用;模板层:测试一组协同的类之间的相互作用,相当于集成测试;系统层:测试整个系统。
易错测试类中每个方法属于算法层,不是类层。
怎么记一个方法 → 一个类 → 一组类 → 整个系统。
先在心里说出答案,再点开核对。
A 是面向对象分析(OOA)的四个活动;面向对象设计(OOD)的活动是识别类及对象、定义属性、定义服务、识别关系、识别包,选 D。
两大类 · 看用途认图 · 用例、顺序、状态、活动、构件、部署图的符号
| 类别 | 包括 |
|---|---|
| 结构图(静态) | 类图、对象图、包图、构件(组件)图、部署图、组合结构图 |
| 行为图(动态) | 用例图、顺序图、通信图、状态图、活动图、交互概览图、定时图 |
易错交互图 = 顺序图、通信图、交互概览图、定时图;对象图是静态图,不属于交互图;老题里的“协作图”就是通信图。
| 要表达的东西 | 用哪个图 |
|---|---|
| 系统有哪些功能、谁在用 | 用例图 |
| 类、属性、操作和类之间的关系 | 类图 |
| 某一时刻对象的快照 | 对象图 |
| 一个用例里多个对象按时间顺序交互 | 顺序图 |
| 对象之间的链接和消息(消息带序号,如 2.1) | 通信图 |
| 一个对象的状态怎样随事件变化(反应型对象) | 状态图 |
| 活动之间的流程和并发(泳道、分叉、汇合) | 活动图 |
| 软件组件之间的组织和依赖 | 构件图 |
| 软件组件和硬件结点的物理分布 | 部署图 |
| 模型分成哪些组织单元、单元之间的依赖 | 包图 |
参与者是人、硬件或其他系统和本系统交互时扮演的角色,在系统外部。用例之间三种关系:包含«include»:基用例一定会调用它,箭头从基用例指向被包含的用例;扩展«extend»:满足条件才发生,箭头从扩展用例指向基用例;还有泛化。
怎么记说明里写“必须”的是 include,写“可以、有时”的是 extend。
按时间顺序排列对象之间的消息,适合描述一个用例里多个对象的行为。同步消息(实心三角箭头):发出后等对方返回;异步消息(开放箭头):发出就继续;返回消息:虚线。
易错箭头指向的对象,它所在的类要实现这个消息对应的方法;返回消息不是要实现的方法。
怎么记顺序图看时间,通信图看连接。
对反应型对象建模:一个对象的状态怎样随事件变化。转换写成事件 [监护条件] / 动作:事件发生时才检查监护条件,为真才转换,同时执行动作(效果)。
易错“状态由事件触发”“一个转换包含一个状态”都是错的;状态图不描述多个对象之间的交互。
怎么记事件是门铃响,监护条件是“家里有人”,动作是开门以后做的事。
描述活动之间的流程,可以细化复杂的用例。同步棒(粗横线)表示分叉和汇合:分叉后、汇合前的各分支可以同时执行,能同时运行的最大线程数等于并行分支数;汇合后的活动要等所有分支都完成。
怎么记粗线一分为三,三件事一起做。
展现一组组件之间的组织和依赖,是静态实现视图。接口末端是完整的圆表示提供接口(供接口),半圆表示需求接口(需接口)。
易错完整圆是供接口、半圆是需接口,别颠倒。
展现运行时的处理结点和其中构件的配置,表示软件组件与硬件之间的物理关系(系统的物理分布),通常在实施阶段使用。
补充表示软硬件物理关系选部署图,不选组件图或网络图。
先在心里说出答案,再点开核对。
转换由事件触发,写成“事件 [监护条件] / 动作”,里面没有状态;监护条件在事件发生时才检查;活动既可以在状态内执行,也可以在转换时执行。所以 C 不正确。
D4 晚间任务;26 套里只考过 2 套,看一遍认得出就行
| 是什么 | 例子 | |
|---|---|---|
| IaaS 基础设施即服务 | 租用服务器、存储、网络等硬件资源 | 云服务器、云硬盘 |
| PaaS 平台即服务 | 租用开发和运行平台,自己只管应用 | 云数据库、应用托管平台 |
| SaaS 软件即服务 | 直接通过网络使用软件 | 在线邮箱、在线文档 |
| 私有云 | 为单一客户单独构建 | |
| 公有云 | 面向公众提供 | |
| 社区云 | 多个组织共享 | |
| 混合云 | 两种以上组合 |
从 IaaS 到 PaaS 再到 SaaS,云服务商负责的部分越来越多:IaaS 只给硬件资源,PaaS 再给运行平台,SaaS 连软件都给好了。
怎么记涂色越多,自己要管的越少。
为单一客户单独构建的是私有云,面向公众的是公有云,多个组织共享的是社区云,两种以上组合的是混合云。
三层:感知层(传感器、RFID 采集数据)、网络层(把数据传上去)、应用层(智能家居、智慧城市等应用)。
每个区块记着上一个区块的哈希,连成一条链;改了一块,后面的哈希就全对不上。特点:去中心化、不可篡改、可追溯。
大数据常说 4V:数据量大、类型多、处理速度快、价值密度低。网上银行支付要通过支付网关在 Internet 和银行专用网之间交换数据。
先在心里说出答案,再点开核对。