面向对象思想
总述:
面向对象设计的基石:
封装、继承、多态
关键: 抽象
+ 类间关系 + 类种类与类职责 + 反射与注解
类的种类:
一、按是否可实例化分类:抽象类或接口,具体类
二、按是否使用继承分类:父子类,普通类
注:抽象类和接口必须作为父类,否则没有任何意义。
类间关系(6种):
1. 泛化: 继承、实现
2. 非泛化:关联、聚合、组合、依赖
面向对象的性质:
封装性、继承性、多态性
面向对象设计,就是通过对现实世界建立模型;利用抽象、封装、继承、多态、反射等机制。确定类(具体类、抽象类、接口)的职责及类之间关系(继承、实现、依赖、关联、聚合、组合);达到软件的可重用、可维护、可扩展等特性。
**************************************************************************************************************************************************************
l 面向对象思想:
哲学观:宇宙即时空,空间的变化产生时间。空间由虚与实构成,实即物质对象,虚即关系和能量。实的对象之间通过虚的关系相互作用,从而构成整个宇宙。
而对象和关系也分虚实,实对象即物质对象,虚对象即人抽象出的概念对象。实关系即现实世界中各实对象间的关系,虚关系即人假想出来的关系。
方法论:面向对象思想即对现实中的对象与关系进行直接映射,建立模型,然后通过思维加工修饰(关键是抽象),构建整个软件系统。
l 面向对象的性质:封装性,继承性,多态性
l 面向对象分析:
即“面向对象思想”中的方法论
l 面向对象设计:注:面向对象设计的关键是抽象。
第一步:建模
对现实中的事物进行建模,找出所有的对象及对象间关系(这里的对象指现实世 界 的对象),建立世界模型。
第二步:映射
根据建立的模型,将对象映射为类及类间关系。
第三步:重构
抽象出抽象类和接口,重构类及类间关系。这里需要利用抽象、继承、多态、封装以及反射的手段,重构类的种类、类的职责、类间关系。
面向对象设计原则:
模块化 抽象 信息隐藏 低耦合 高内聚
开闭原则+单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则、组合/聚合复用原则
面向对象特性:
抽象 封装 继承 多态
特性的具体编程时体现:
l 抽象:抽象类、接口
l 封装:类、对象
l 继承:子类父类
l 多态:虚函数; 重载、模板、宏
附:
面向对象术语:
属性 方法 重载 构造函数 析构函数 改写 虚函数 纯虚函数 抽象类 虚拟继承 模板
各术语的含义:
重载:指函数重载
改写:指在子类中重写父类中的方法
重载与改写的区别:重载要求函数名相同,参数的个数或类型不同;改写要求返回类型,
函数名,参数列表都相同,且同为const或非const成员
虚函数:为了实现多态而设
纯虚函数:特殊的虚函数,为了实现抽象类而设
虚拟继承:多重继承时,若A{a} B:A{b} C:A{}
若D多重继承B和C,则D:B,C{}中的数据有(a,b,a,c)即B、C继承的A中
的a重复了。为了解决这个问题,从而引入了虚拟继承。这样就成了(a,b,c)。
类之间关系
类的种类:
按是否可实例化分类:抽象类或接口,具体类
按是否使用继承分类:父子类,普通类
注:抽象类和接口必须作为父类,否则没有任何意义。
UML把类之间的关系分为6种:
1. 泛化: 继承、实现
2. 非泛化:关联、聚合、组合、依赖
下面分条讲解:
l 1. 泛化(继承、实现)
【定义】
泛化表示类与类之间的继承关系,接口与接口之间的继承关系;或类对接口的实现关系。
【具体表现】
父类 父类实例=new 子类()
【UML图】
也有地方将泛化进一步细分为继承(类继承类,接口继承接口)与实现(类对接口的实现)
【代码表现】
class Animal{}
class tiger extends Animal{}
public class test
{
public void test(){
Animal a=new tiger();
}
}
l 2. 依赖
【定义】
对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对 象的服务时,这两个对象之间主要体现为依赖关系。
【具体表现】
依赖关系表现在局部变量,方法的参数,以及对静态方法的调用
【UML图】
【代码表现】
public class person{
//人使用螺丝刀来完成拧螺丝的操作
public void screw(ScrewDriver screwdriver){
screwdriver.screw();
}
}
l 3. 关联(分单向关联、双向关联、多维关联、自身关联)
【定义】
对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定 的对应关系时,这两个对象之间为关联关系。
【具体表现】
关联关系是使用实例变量来实现
【UML图】
l 4. 聚合
【定义】
聚集是关联关系的一种特例。聚集指的是整体与部分之间的关系,他体现的是整体与部 分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各 自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机 与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义 级别来区分
【具体表现】
与关联关系一样,聚合关系也是通过实例变量来实现这样关系的。
关联关系和聚合关系来语法上是没办法区分的,从语义上才能更好的区分两者的区别。
【UML图】
l 5. 组合
【定义】
组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更 强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分 的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现 在代码层面,和关联关系是一致的,只能从语义级别来区分。
【具体表现】
与关联关系一样,组合关系也是通过实例变量来实现这样关系的。
关联关系和聚合关系在语法上是没办法区分的,从语义上才能更好的区分两者的区别。
【UML图】