面向对象纲要

1.1面向对象基本概念

1.1.1基本概念
面向对象是一种新的 程序设计范型构造系统的软件开发方法 ,基本思想是使用对象、类、继承、封装、聚合、关联、消息、多态等基本概念来进行程序设计。

1.1.2 面向对象三大特征
继承,封装,多态

1.1.3 基本思想
对问题空间进行自然分割,以更接近人类的思维方式建立问题域模型,以便对客观实体进行结构模拟和行为模拟,从而使设计出的软件尽可能直接地描绘现实世界。
构造出模块化,可复用,维护性好的软件,同时限制软件的复杂性和降低开发维护开销。

1.1.4 与非面向对象语言的对比
面向对象程序设计中倒转了细节和抽象的关系,使得创建的抽象不依赖于任何细节。而细节高度依赖抽象。

1.2对象

1.2.1对象的概念
对象是独立存在的客观事物,由一组属性和操作构成。属性是对象的静态特征描述,操作是对象的动态特征描述。

1.2.2属性
属性面熟对象的状态。一般只能通过执行对象的操作来改变(封装性)

1.2.3操作
操作又称为方法或服务,他描述了对象的行为,和执行的功能,通过消息传递,还可以为其他对象使用

1.2.4对象的性质
封装性:具有信息隐藏的能力,封装的意义是避免重复代码和保护类收到不必要修改。
自治性:对象拥有一定的独立计算能力
通信性:对象之间可以进行通信
暂存性:具有作用域和存在时间
持久性:对象可以通过文档串行化保存

1.2.5对象标识
对象标识是将一个对象与其他对象加以区别的标识符,不随对象的状态变化。在具体使用中,一般用变量名(直接标识)或指针(间接标识)充当标识。

1.2.6复合对象
一个对象的属性引用了其他对象的情况,将这个对象称为复合对象或者复杂对象。引用对象属性的值是被引用对象的对象标识。
委托是复合对象的一个特例,在委托方式下可有两个对象参与处理一个请求,接受请求的对象将责任委托给它的代理者

1.3 类

1.3.1类的概念
类是具有相同属性和操作的对象的集合。

1.3.2类与对象的关系
类是静态概念,对象是动态的概念
根据抽象原则对客观事物进行归纳和划分,只关注与当前目标相关的特征,把具有相同特征的事物归为一个类。

1.3.3类的实例
实例是从一个类创建而来的对象。每个实例可以由该类定义的操作(方法)来操作。

1.3.4类方法和类变量
一个类的所有实例共享的变量或者不依赖于具体对象的方法被称为静态的。Java中,静态数据字段初始化是在加载类时执行静态块来完成。
类方法不能访问非静态成员,不能使用this引用。

1.3.5类对象
类本身也是一个对象,这个对象是元类的实例。类对象也有其属性和方法,被称为类变量和类方法(静态变量,静态方法)。通常都包括类名称,类实例所占用的内存大小,以及创建新实例的能力。

1.3.6元类metaClass
元类是描述类的类,(java中只有一个元类,就是Class类),所有的类对象都是某个元类的实例。
可以用类作为模板来生成对象,用元类作为模板来生成类。
引入元类的优点是,只用对象概念就可以表述系统中所有的成份。使类成为运行时刻的一部分,有助于改善程序设计的环境。继承的规范化,类与元类的继承采用双轨制。

1.3.7反射
反射支持一个组件动态地加载和查询自身的信息,因此反射为许多基于组件的编程工具建立了基础。
通俗来讲,反射就是运行时一个对象了解自身的能力。
反射分为两大类,获取理解当前计算状态的特征,用于修改的特征:增加新的行为
反射工具都开始于一个对象,该对象是关于一个类的动态体现。

1.3.8复制和克隆
浅复制:共享实例变量 深复制:建立实例的新的副本
通俗解释就是浅复制只是复制了对象标识,深复制复制了对象本身。
影子克隆:当一个对象A中包含另一个对象C的引用时,克隆这个对象,克隆后的对象B对于那个对象的引用都指向C。这被称为影子克隆。如果指向的是不同的对象(c的克隆)则被称为深度克隆

1.4 消息

1.4.1消息的概念
操作是 对象间 相互请求或相互协作的途径。对于另一个对象的操作在于选择一个对象并通知前者要做什么。这里,接收消息的对象被称为“接收器”

1.4.2消息的特征
消息的特征在于利用消息传递,使被通知对象自己去执行操作,而不是发送消息的对象去修改另一个对象。发送消息的对象并不需要知道接收消息的对象如何相应消息。

1.5 封装
1.5.1封装的概念
所有信息都存贮与对象之中,影响对象的唯一方式是执行它的方法。

1.5.2封装的意义
当使用对象时,不需要知道对象的属性以及行为的内部是如何表示以及实现的,只需要知道它提供了哪些方法即可。

1.6继承

1.6.1继承的概念
继承是一种使用户可以在一个类的基础上建立新类的技术,旧类被称为父类(超类),新的类被称为子类。子类自动继承旧类的属性和行为特征,并可以具备附加的特征和限制。

1.6.2子类和父类的关系
父类和子类之间存在着一般和特殊的关系,也称作泛化特化关系。可以使用is a来检验。

1.6.3继承的意义
代码复用和概念复用,共享方法的定义。

1.6.4替换原则
在静态类型语言中,如果B是A的子类,那么任何情况下都可以用类B来替换类A
这也是面向对象编程中可替换性的基础。可替换性指变量声明时指定的类型不必与它所容纳的值类型一致(通常是父类引用指向子类对象)

1.6.5子类型
指符合替换原则的子类关系,区别于可能不符合替换原则的子类关系。

1.6.6继承的形式
特化子类化:子类是父类的一种特定类型,满足父类所有规范,是子类型。
规范子类化:子类实现了父类描述但没有实现的行为(即抽象方法),但不改变已有的方法,即父类是抽象类。也被称为抽象规范类。
扩展子类化:子类中添加了新的方法但不修改原来的方法,不违反替换原则。
泛化子类化:修改了父类原有的方法,也添加了新的方法。
构造子类化:目的只是为了代码复用,使用父类中的一些功能,没有明显继承关系。经常违反替换原则。
变体子类化:两个类需要实现类似的功能,但不存在层次关系。比如控制轨迹球和机械鼠标。
合并子类化:多继承

1.7方法的改写,重载,重定义以及绑定

1.7.1方法签名的概念
一个函数由函数名、参数个数、参数类型及顺序、返回值组成。以下提到签名时,一般是利用函数签名的不同(即参数个数与类型和顺序的不同,返回值不能作为依据)来区别到底调用哪个方法。

1.7.2重载
同一个类中,相同方法名,签名不同。在编译时解析。

1.7.3重定义
子类中的方法,方法名与父类相同,但签名不同。

1.7.4改写
子类中的方法与父类中方法的方法名,签名都相同

1.7.5变量的静态类和动态类
声明一个变量时所指定的类被称为变量的静态类,编译时确定且不会更改。动态类指变量当前表示的数值代表的类,运行时可以被更改。
例如Animal a = new Cat(),Animal是a的静态类,Cat是a的动态类。通常,动态类与静态类不同时,两者存在继承关系。
对于静态类型语言,在编译时,传递表达式的合法性是基于接收器的静态类来决定的。

1.7.6动态方法绑定与静态方法绑定
相应消息时,如果决定调用哪个方法时通过接收器当前的动态类来确定,被称为动态方法绑定,反之被称为静态方法绑定

1.7.7强制,转换/造型
强制是一种隐式的了类型转换,例如int与double一起计算时将会强制转换为double。
转换表示程序员进行的显式类型转换,也被称为造型。

1.7.8重定义的融和模型和分级模型
在分级模型中,每个范畴(作用范围)都维护自己独立的列表,子类中重定义父类方法之后,将只能检测到子类重定义的方法,而不能访问父类的方法
而融合模型中,经过重定义的子类对象可以直接调用父类的同名方法(参数不同),形式上类似重载。

1.7.9改写的方式
替代:完全覆盖父类的方法,父类代码完全不会执行
改进:继承父类方法的执行作为行为的一部分(super)

1.7.10遮蔽
当子类中包含与父类相同名称的变量且不使用显示声明的关键字时,将产生遮蔽,即子类引用调用该变量只能访问子类的变量。遮蔽是编译时基于静态类型解析的,不需要运行时机制。
或在c++中不将方法设置成virtual,且类型签名相同,在子类中会产生遮蔽。
但父类引用指向子类对象时,看到的依然是父类的方法和变量。

1.7.11协方差和反协方差
出现在改写中。一般不允许改写的方法与原方法有不同的类型签名。
父类→子类的方法,父类用抽象层次较高的类作为参数,而子类用抽象层次较低的类作为参数称为协方差变化,如父类方法参数是动物,子类方法参数是猫。反之称为反协方差变化。

1.8多态

1.8.1多态性的概念
多态性是指一般类中定义的方法或变量,在特殊类中不改变其名称,但通过各自不同的实现之后,可以有不同的行为或者数据类型。(后者被称为多态变量)
概括地讲,多态是指能够在不同上下文中,对某一事物赋予不同含义或用法。

1.8.2伪变量this
隐含,指向对象本身

1.8.3多态的形式
重载(专用多态),重置/改写(overriding,包含多态),多态变量(赋值多态),泛型/模板(通用多态)

1.8.4多态变量
指可以引用多种对象类型的变量。这种变量在程序执行过程中可以包含多种不同类型的数值。对于动态类型语言,所有变量都可能是多态的,对于静态类型语言,多态变量是替换原则的具体表现。
1.8.4.1多态变量的具体体现
简单多态变量:父类引用指向子类对象
接收器变量:例如伪变量this,表示正在执行的方法内部的接收器。
反多态:将父类引用转换为子类引用,取消多态赋值的过程,也被称为向下造型
纯多态(多态方法):支持可变参数的方法,即方法的参数是多态变量。

1.8.5泛型
泛型通过类型的使用提供了一种将类或者函数参数化的方法。
泛型提供了一种无需识别特定数值的定义算法的方法。
泛型将名称定义为类型参数,编译时无法知道类型的属性,但是可以像类型一样使用类型参数。将来某一时刻,会通过具体的类型匹配这一类型参数。
通俗的讲,泛型相当于留下一个类型的空位(即类型参数),可以像使用普通的类型一样使用它。使用时,给这个空位填充上确定的类型。

1.9抽象

1.9.1泛化
通过将若干类共享的公共特征提取出来形成一个新类,并且将这个类放到类继承层次的上端以供更多的类重用

1.9.2抽象类
抽象类不能创建实例

1.9.3接口
接口定义方法但不实现,类可以实现接口,接口可以继承于多个接口。
接口的所有方法都是public abstract的
接口中的变量都是静态常量

1.10组合

1.10.1组合的概念
一种利用已存在的软件组件来创建新的应用程序的方法。
通俗的讲,组合是射击类的时候把要用到的类的对象加入到该类中作为自己的成员变量,需要时调用该类的对象即可。
组合类似于委托的形式,而非替换。语义为A has a B

1.10.2组合的优点
对象只能通过包含的那个对象去调用其方法,具有较好的封装性
低耦合,可修改性好
当前对象可以动态绑定需要包含的对象

1.10.3继承的优点
代码简洁,子类可以重写父类方法来实现对父类的扩展。

1.10.4继承的缺点
父类细节对子类可见,封装性差
子类在运行期间无法改变从父类继承的方法的行为
高耦合,修改弗雷德方法,子类方法必须做出相应的修改。

1.10.5组合的缺点
容易产生过多的对象

1.10.6继承还是组合
组合比集成具有更强的灵活性和稳定性,所以在设计的时候优先使用组合。

1.11框架

1.11.1概念
对于一类相似问题的骨架解决方案。
通过类的集合形成。类之间紧密结合,共同实现对问题的可复用解决方案。
是继承和改写的强大能力的体现

1.11.2实例
Java中的gui框架,c++中的qt,web开发中的struts框架。

1.11.3基本方法和特化方法
基本方法指框架中的类提供的方法,一般不需要子类重写。
特化方法指框架中的类提供的抽象方法,由子类实现。

1.11.4复用和特化
复用和特化是框架开发的重要基础,通过继承实现。
代码复用指用调用基本方法解决问题,概念复用指通过特化方法解决特定应用的解决方案。

1.11.5框架的倒置性
框架改变了应用程序与库代码之间的关系。
传统的应用程序中,应用程序特定代码定义了程序执行的流程。
在框架中,控制流是有框架决定的,随应用程序的不同而不同。新的应用程序创建者只需要改变供框架调用的例程即可,无需改变总体结构。
框架占主导地位,而应用程序特定代码处于次要地位。

1.12对象互连

1.12.1对象互连概念
指一组对象之间相互作用和联系的方式。

1.12.2对象互连的评判
可视性:通过该名称可以存取对象,如果对象的名称是合法而且代表其对象,在这个特定环境下该对象可见。(标识符的范畴)
依赖性:不存在另一个类的条件下,如果一个类的存在毫无意义,就说该对象依赖于另外那个对象。子类总是依赖父类

1.12.3耦合
耦合描述了类之间的关系
1.12.3.1耦合的类型(从最差到较好)
内部数据耦合:发生在一个类的对象直接修改另一个类对象的实例变量时。
全局数据耦合:两个类都依赖于公共的数据。
控制或顺序耦合:一个类以一种必须以特定顺序来执行几个方法且暴露给外界。
组件耦合:一个类包含另一个类的实例。
参数耦合:一个类的方法要提供另一个类的实例作为参数。
子类耦合:继承关系

1.12.4内聚
内聚性是该结构中各个元素之间的绑定程度
1.12.3.1内聚的类型(从最弱到最强)
随机内聚:对程序随意划分
逻辑内聚:算术程序库
时间内聚:实现程序初始化的类
通信内聚:数据或设备的manager
顺序内聚:避免顺序耦合(把要按照顺序执行的方法内聚)
功能内聚:类中的元素按照特定功能关联起来
数据内聚:数据结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值