菜单
菜单
文章目录
  1. 〇、基本概念整理
    1. 1.设计模式
    2. 2.面向对象方法
    3. 3.程序设计的发展历程
    4. 4.面向对象方法与传统方法的比较
  2. 一、面向对象思想
    1. 1.代理和团体
    2. 2.消息和方法
    3. 3.责任
    4. 4.类和实例
    5. 5.类的层次–继承
    6. 6.方法绑定与改写
    7. 7.多态
    8. 8.总结OOP
  3. 二、面向对象编程与非面向对象编程
    1. 1.软件开发方法
    2. 2.结构化软件开发方法
    3. 3.非面向对象编程
    4. 4.面向对象编程
    5. 5.面向对象语言
    6. 6.面向对象的优点
  4. 三、抽象
    1. 1.抽象
  5. 四、类和方法
    1. 1.封装
    2. 2.概念
    3. 3.类的主题变化
  6. 五、消息、实例和初始化
    1. 1.消息:对象间相互请求或互相协作的途径
    2. 2.静态类型语言/动态类型语言

面向对象复习(一)

〇、基本概念整理

1.设计模式

解决某一反复出现的问题而总结的设计经验,俗称【套路】。

2.面向对象方法

定义:是一种运用对象、类、继承、封装、聚合、关联、多态等概念的来构造系统的软件开发方法。

出发点:使人们更容易分析、设计和实现一个系统(程序)的方法。

基本思想:(1)联系现实的事物 (2)利用日常思维

3.程序设计的发展历程

阶段1 简单的顺序程序

阶段2 难以控制程序的复杂程度

阶段3 面向现实,结构随意

阶段4 分布计算、UML、设计模式

4.面向对象方法与传统方法的比较

比较 1 2 3 4 5 6 7 8
传统方法 数据结构+算法 数据 操作 类型与变量 函数的调用 类型与子类型 构造类型 指针
面向对象 对象的数据与操作 属性 方法 类与对象实例 消息传送 一般类、特殊类、继承 整体与部分 (组合),聚合 关联

一、面向对象思想

1.代理和团体

代理:代为执行某一方法的对象

团体:一个使用面向对象方法的程序中 ,相互产生作用的代理(们)

对象:独立的、客观的事物。一切事物都是对象。 其性质:封装、自治、通信(并发)、暂存、永久

复合对象:PC是一个对象,CPU也是一个对象,但是从组成单元上讲,PC就属于复合对象。 (两种整体与部分的关系【组合】:分开就失去作用;【聚合】:分开还能用)

每一个代理都是一个对象,每个对象都具有一定的属性和方法,来提供某种服务或执行某一动作,为其他对象服务

2.消息和方法

消息:是对象间的通信手段

方法:对象所能执行的方法

消息传递与过程调用

​ ● 每一条消息都有一个指定的接收器相对应;接收器就是消息发送的对象。过程调用没有指定的接收器。

​ ●  消息的解释由接收器决定,并且随着接收器的不同而不同。

​ ●  动态绑定。

信息隐藏

​ ● 作为某对象提供的服务的一个用户,只需要知道对象将接受的消息的名字。

​ ● 不需要知道要完成要求,需要执行哪些动作。

​ ● 在接收到一条消息后,对象会负责将该项任务完成。

面向对象编程中,行为的启动是通过消息传递使另一对象执行方法来完成的。每一条消息都有一个指定的接收器(接收到消息的对象,也是消息发送的对象)。

3.责任

不干预政策:假设A给B一个任务,A对行为的要求仅表明他所期望的结果,并不关心B使用了什么方法。

好处:提高了抽象水平,对象更加独立。

4.类和实例

类是具有相同属性和相同方法的对象的集合。(抽象的)类是对象行为的储存库,同一个类的所有对象都能执行同样的动作。

所有的对象都是类的实例。(具体的)

在响应消息时调用何种方法由类的接收器决定。一个特定类的所有对象使用相同方法来响应类似的消息。

5.类的层次–继承

类被组织成有单根节点的树状结构(二叉树状)称为继承层次结构。与类的实例相关的内存和行为都会被树的后代自动继承。

在类的层次结构中与某层相联系的信息(数据、行为)都会自动地提供较低层次结构中的信息。

继承表达了对象的一般与特殊的关系。(也叫作泛化和特化的关系)

特殊类的对象具有一般类的全部属性和全部方法(服务)。

6.方法绑定与改写

改写:将子类的某一方法取与父类方法相同的名称,结合寻找方法的规则实现改写。接收器搜索并执行相应方法以响应给定的消息。如果没有找到匹配方法,搜索就会传到父类的父类,如此循环,直到结束。如果在父类的父类或再之上的,称为改写了继承的行为

7.多态

多态性是指一般类中定义的属性和服务,在特殊类中不改变其名字,但通过各自不同的实现后,可以具有不同的实现后,可以具有不同的数据类型或不同行为。

8.总结OOP

OOP是基于递归设计的原则的:

​ ● 一切都是对象。

● 计算通过对象间相互通信,请求其他对象执行动作来实现。对象间通过发送和接收消息来通信。

● 每个对象都有自己的内存,其中可能包括了其他的对象。

​ ● 每一个对象都是某个类的实例。类就是一组相似的对象。

​ ● 类是对象相关行为的储存库。也就是说,同一个类的所有对象都能执行同样的动作。

● 类被组织成有单个根节点的树状结构,被称为继承层次结构。与类实例相关的内存和行为都会被树结构中的后代自动继承。

二、面向对象编程与非面向对象编程

1.软件开发方法

​ ● 功能分解法

​ ● 数据流法

​ ● 快速原型法

​ ● 面向对象方法

2.结构化软件开发方法

​ ● 自上而下的设计

​ ● 主体是方法,方法是最小的功能模块,一组相关的方法组合成一个大的功能模块

3.非面向对象编程

​ ● 往往面向过程 or 面向数据

​ ● 程序的每个部分都可以访问全局变量

4.面向对象编程

​ ● 每个程序划分为一组通信的对象

​ ●每个对象均封装了关于每个概念的所有行为和信息

​ ●实现功能的能力、实现功能所需的知识或数据被分布在对象之中。当一个对象对其他对象有需求时,就向该对象发出消息,这个对象接受到此消息后所作出的相应动作并很有可能返回值给调用者。

​ ●第一个对象甚至可以在第二个对象不存在的情况下,创建第二个对象。

​ ●对象分摊工作和责任

5.面向对象语言

​ ●类的概念可以从建模角度及编程语言的角度来理解,类可以理解成对象的模板。

​ ●对象之间通过消息传递的方式通信并命令彼此进行动作

​ ●通过向其他消息传递信息,也就是方法。

6.面向对象的优点

·每个对象仅需维护自己的任务和数据

·方便理解各单元之间的相互影响,增加代码的可读性

·良好的面向对象设计师采用较少的全局数据

·对象所处的类的数据存储方式的改变通常意味着,程序中需要改变的部分只有该类内部的代码而已

·如果编程人员认为某个对象工作过于低效,可以重新设计

·对象可以重用复用

三、抽象

1.抽象

​ ●定义:抽象是指对于一个过程或者一件制品的某些细节有目的的隐藏,以便于把其他方面、细节或者结构表达的更清楚。(信息隐藏)抽象,是控制复杂性时最重要的工具。

​ ●实例:地图

​ ●技术:每个抽象层次,包括了某些信息,也忽略了某些信息

​ ●层次

​ (1)团体:最高级别(一指程序员团体,二指创建的对象团体)。

​ (2)单元:许多语言允许协同工作的对象组合到一起。

​ (3)C/S:客户端和服务。该级别抽象通常用接口表示,定义行为,但不描述实现方法。

​ (4)服务实现方式:考虑抽象行为的具体实现方法,例如多种实现堆栈的方式。

​ (5)具体实现:关注到执行某一个方法的具体操作实现。

​ ●确定抽象等级

​ 在软件开发的早期,关键问题在于确定合适的层次抽象。既不要忽略太多细节,也不要包括太多

​ 太多细节。

​ ●抽象形式

​ · 分治法

​ 通常将一层划分为多个组成部分。例如汽车划分成组成部件、接口。

​ · 特殊化(具体化、专门化)

​ 例如汽车既是运载工具,这同样适用于汽车和自行车。

​ · 不同视角

​ 例如汽车在机械师和买家的眼里是不一样的。草地上的鲜花,牛看来只是饲料罢了。

​ ·分类

​ 当系统组件过多时,常用分类来组织。如京东的目录。

​ ·服务视角

​ 对接口和实现的划分,不仅从高层的角度对设计易于理解,而且是软件租借的替换成

​ 为可能。接口描述软件组成所提供的服务,不必面熟完成服务所使用的技术。这个思想是

​ 理解和处理复杂软件系统的核心手段。

​ 团体中的每一个成员,都提供一中被团队的其他成员使用的服务。没有一个成员可以

​ 独立解决问题。

​ ·组合

​ 组合是一个由简单到组建复杂的有力技术。组合的关键之处在于即可对初始形式进行

​ 组合,也可以对新形式进行组合。

​ ·特化分层

​ 也叫分类法。例如:生物分为植物和动物,动物又分为有脊椎和无脊椎动物……

​ 非标准行为:鸭嘴兽的例子提醒我们,万事总会有例外

​ 继承方式:is - a 继承,has - a 继承

​ ·模式

​ 以前的问题可以作为一个解 决问题的模型,略做修改可能就能解决新问题

​ ●发展简史:过程-模块-抽象数据类型-面向对象

​ 过程:部分信息隐藏

​ 观察

​ 模块:解决全局名称的空间拥挤问题。用来改善建立和管理名称集合及其相关数值的一种技术。希望公开的是接口,限制存取的是堆栈数据,模块提供了将名称空间划分为两个部分的能力,共有部分可以在模块外存取,私有部分只能在模块内存取。模块不允许 实例化,实例化是一种能够建立数据区域多份拷贝的能力。

​ 抽象数据类型:目标分别是定义抽象创建多个实例,使用实例,知其所以,不必知道之所以。ADT通过抽象规范来定义。重要进展是吧接口的概念和试下的概念分离开来。

​ 以服务为中心:汇编:功能;模块和ADT:数据;面向对象:服务

​ 消息、继承和多态:ADT上增加的新思想。

四、类和方法

1.封装

利用数据抽象进行编程,数据类型:外部用户、实现者。

避免重复代码,保护类受到不必要的修改

2.概念

实例 变量/数据成员/数据字段

对象 状态+行为 对象外部看,客户只能看到对象的行为;对象内部看,方法通过修改对象的状态,以及和其他对象的相互作用,提供了适当的行为。

类 先列出主要特征,次要特征列在后面。私有数据列在后面。构造函数列在前面。java全文扫描,C、C++向前定义

3.类的主题变化

内部类 java内部类被连接到外部类的具体实例上,并且允许存取实例和方法。C++只是命名手段,限制和内部类相关的特征可视性。http://blog.csdn.net/a450828540/article/details/8993160

注意:java非静态类的嵌套

内部类(嵌套类)在一个类中定义另外一个类。(Java内部类。C++嵌套类)

语义差别

Java内部类被连接到外部类的具体实例上,并且允许存取其实例和方法。C++仅是命名手段,限制和内部类相关的特征可视性。

​ • Java的非静态内部类有个外部类的引用outer,使用这个变量可以引用外部的所有变量,包括private

​ • 静态的java内部类也叫做嵌套类,静态的内部类就没有外部的引用了,但是也只能调用外部的静态方法和变量

​ • c的内部类几乎等同于语法上的嵌套,而C的内部类不能访问外部类的private变量,想访问的话必须在内部类中声明外部类为friend class
http://blog.csdn.net/a450828540/article/details/9045067

五、消息、实例和初始化

1.消息:对象间相互请求或互相协作的途径

  • 对象可接受多个消息,响应不同
  • 同一消息给多个对象,响应不同
  • 广播,可响应可不响应

2.静态类型语言/动态类型语言

伪变量 this 隐含指向调用成员函数的对象

默认隐藏

等价

参数传递

指针

内存回收

内存分配策略:静态(编译确定)、栈式(先进后出)、堆式(任意顺序)

构造函数

元类:1⃣️为语言提供了一个方法可以将类的特定行为集成起来2⃣️一个类首先并不是作为Class的实例,而是首先作为它的元类的实例,而该类又是继承自Class类3⃣️通过继承,元类得到了所有Class的行为,但是它也提供了定义类的特定行为的空间

反射和内省 :获取理解当前计算机状态的特征;用于修改特征,增加新的行为
反射支持一个组件动态的加载和查询自身信息,因此反射为许多基于组件的编程工具建立了基础(程序中的错误定位,灵活调用对象的方法)

检查对象类更好的解决方案

建立一个新方法,子类特定行为移到
子类中完成,缺省行为移到父类中完
成。

这样做不仅代码数量减少,而且也减
少了潜在的出错机会。

假如要增加一个新的子类,只需要保