面向对象
什么是面向对象呢?
个人理解的是抽象和映射;
抽象出对象,映射现实事物;
- 即用自己的代码来模拟实现真实世界的一个事物;通过对真实世界的的属性、行为进行抽象,来映射真实世界的实际事物。通过代码抽象出属性和方法,映射为代码;用对象对代码进行组织。
“对象”即真实世界事物的特征抽象;
什么是类?什么又是对象?
- 类
- 类是具有相同属性和方法的一组对象的抽象的集合(一个类对应有多个对象)。
- 类又是对象模板
- 对象
- 对象是类的实例,是具体的,真实存在的。
- 对象必定具备类的属性和行为。
- 类与对象的关系
- 类是对一类事物的描述,是抽象的。
- 对象是一类事物的实例,是具体的。
- 类是对象的模板,对象是类的实体。
例如:人类,能吃饭,睡觉。小明也能吃饭,睡觉。
面向对象和面向过程的区别
例如 洗衣服
- 面向过程:把衣服脱下来–>找一个盆–>放点洗衣粉–>加点水–>浸泡10分钟–>揉一揉–>清洗衣服->拧干–>晾起来
- 面向对象:把衣服脱下来–>打开全自动洗衣机–>扔衣服–>按钮–>晾起来
区别:- 面向过程:强调步骤。
- 面向对象:强调对象,这里的对象就是洗衣机。
面向对象的三大特性
- 封装
将对象的成员变量、方法进行保护隐藏细节并绑定,提供公共的访问接口(get、set方法),保证一定安全性;构成一个不可分割独立的实例对象。- 优点:
- 复用
许多共有重复的代码能够通过抽取封装一个类成员方法,达到复用代码的目的; - 解耦
当复杂的逻辑代码杂糅在一起,耦合度很高,不符合开-闭原则。通过抽取封装代码,达到解耦,拓展功能更易,不会影响原有逻辑;
- 复用
- 优点:
编写的方法就是对实现细节的封装,编写的类就是对数据和操作数据的封装,只提供最简单的接口
- 继承
继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类;得到继承信息的类被称为子类。
子类能有自己本身的功能不会影响到父类,所以继承让变化中的软件系统有了延续性和拓展性。- 优点:
- 拓展
- 复用
- 让类与类之间产生关系,是多态的前提
- 缺点:
向上转型是安全的,而向下转型则是有一定风险的。 PS:Instanceof 可以来防止异常风险
- 优点:
因子类继承于父类,使用父类的程序也能使用子类。即子类就能当做父类,让父类被复用,而子类又在父类基础上增加新的行为,也能在父类的基础上对父类原有功能进行增强。
- 多态
指同一个方法,不同的对象有不同的实现形式。- 编译时的多态
- 重载(Overload):方法的参数不同,方法名相同。
指在编译期传入参数时就确定好具体调用的实现方法。
- 重载(Overload):方法的参数不同,方法名相同。
- 运行时的多态
- 重写(OverWrite):方法名、参数、返回值也相同,仅执行的方法体不同。
指只有程序运行时期才会知道具体执行的方法。
具体实现步骤:
1.子类重写父类[父接口]的方法
2.父类[父接口]引用指向子类(不同的子类对象,会有不同的表现形式)
- 重写(OverWrite):方法名、参数、返回值也相同,仅执行的方法体不同。
- 编译时的多态
例如猫吃鱼,老虎吃肉,都是吃的行为,表现出不同的形式,即多态。
面向对象的基本原则
单一职责原则(SRP)
- 一个类应该仅有一个引起它变化的原因
如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责。—《大话设计模式》
开放封闭原则(OCP)
- 对拓展开发,对于更改是封闭的
- 遵循开发-封闭原则进行设计和开发系统,能带来可维护、可拓展、可复用、灵活性好的系统架构
无论模块多么封闭,都会存在无法对之封闭的变化,不可能完全封闭,那么就需要对那些变化做出抽象出抽象类或接口隔离同类变化,等到变化时立即采取行动。
“面对需求,对程序的改动是通过新增代码进行的,而不是更改现有的代码” —《大话设计模式》
依赖倒置原则(DIP)
- 高层模块不应依赖低层模块,两个都应该依赖抽象
- 抽象不应该依赖细节,细节应该依赖于抽象
个人简单的理解的话就是面向接口编程,不针对实现编程。
里氏替换原则(LSP)
- 子类型必须能够替换掉它们的父类型
软件实体如果使用的是一个父类的话,那么一定适用于其子类而且察觉不出父类对象和子类对象的区别。—《大话设计模式》
个人理解为就是面向对象中的继承,继承相当于是里氏替换原则的具体实现。
接口隔离原则(ISP)
- 客户端不应该依赖它不需要的接口;
- 一个类对另一个类的依赖应该建立在最小的接口上。
建立单一接口,不建立庞大的接口,细化接口,接口中的方法尽量少。也就是要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。依赖几个专用的接口要比依赖一个综合的接口更灵活。接口是设计时对外部设定的约定,通过分散定义多个接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。
迪米特法则(Law Of Demeter)
如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
- 根本思想:强调类之间的松耦合!!
类直接的耦合越弱,越有利于复用,一个处于弱耦合的类被修改,不会对有关系的类造成波及。即信息隐藏隔离更有利于解耦。
组合/聚合复用原则(Composite/Aggregate Reuse Principle CARP)
- 组合关系:强调部分和整体,一种强的“拥有”关系,就像鸟和翅膀。PS:个人理解话就是内部类吧
- 聚合关系:强调是包含,一种弱“拥有”的关系,就像鸟群和小麻雀。PS:个人理解就是集合和集合里的元素。