面向对象的三大基本特征和五大基本原则

前言

前文提到,面向对象的三个特征:封装、继承、多态。那么面向对象是怎么体现这三个特征呢?

关于五大基本原则,个人找资料的时候看得头都大了,对新手(如我)来说还是比较有理解难度的,本篇用较为简单的表述来帮助理解,想先看进阶版(完全版)的可以先移步:牢记面向对象五个基本原则

面向对象的三大基本特征

1. 封装

封装,就是将客观事物抽象为逻辑实体,实体的属性和功能相结合,形成一个有机的整体。并对实体的属性和功能实现进行访问控制,向信任的实体开放,对不信任的实体隐藏。,通过开放的外部接口即可访问,无需知道功能如何实现。

也就是说,封装主要有以下目的:

  • 可隐藏实体实现的细节。
  • 提高安全性,设定访问控制,只允许具有特定权限的使用者调用。
  • 简化编程,调用方无需知道功能是怎么实现的,即可调用。

举个栗子,X怎么跟别人介绍他的女朋友?

我的女朋友{    属性:        姓名;        (体重等信息就没必要跟别人说了,隐藏起来)    行为:        吃饭;        (其他的别人也不需要知道,隐藏起来)}

X只需要跟别人说他女朋友一些公开的属性就行了,其他的可以选择隐藏。

如果别人想约X跟X女朋友出来一起吃个饭,只需要向X发出邀请,而无需知道X是怎么跟X女朋友商量的。

2. 继承

继承,在继承机制下形成有层级的类,使得低层级的类可以延用高层级类的特征和方法。继承的实现方式有两种:实现继承、接口继承。

实现继承:直接使用基类公开的属性和方法,无需额外编码。

接口继承:仅使用接口公开的属性和方法名称,需要子类实现。

也就是说,继承有以下目的:

  • 复用代码,减少类的冗余代码,减少开发工作量。
  • 使得类与类之间产生关系,为多态的实现打下基础。

举个栗子,怎么样做到年收千万上亿?继承家产就很棒。

X爸{    属性:        股票;        (现金和银行存款作为养老资产,隐藏起来)    行为:        管理公司;}

X爸不想努力了,把公司交给X,自己的现金和银行存款已经够养老了。

X 继承 X爸{    属性:        股票;        (自己的现金和银行存款,隐藏起来)    行为:        管理公司;}

3. 多态

多态,是指一个类的同名方法,在不同情况下的实现细节不同。多态机制实现不同的内部实现结构共用同一个外部接口

也就是说,多态有以下目的:

  • 一个外部接口可被多个同类使用。
  • 不同对象调用同个方法,可有不同实现。

举个栗子,拥有千万资产的X想跟女朋友结婚了。

娶亲{    行为:        领证{挑个黄道吉日去领证};        摆酒{宴请各路亲戚三顿饭};}

X不想像父辈那样专门挑个日子去领证,也不想请一堆不认识的亲戚吃饭。跟未婚妻商量之后,决定这么做。

X娶亲 继承 娶亲{    行为:        领证{跟未婚妻饭后散步,顺便领证};        摆酒{仅仅是宴请亲人和两人各自最好的几个朋友};}

当别人在讨论X是怎么娶亲的时候,可以通过娶亲这个父类,来指向X娶亲子类,这样就可以知道X是怎么娶亲了。

从上述可以看出,多态实现的三个必要条件是:继承、重写(子类继承父类后,对继承的方法重新定义)、父类应用指向子类对象。所以,多态的实现是基于继承的。

面向对象的五大基本原则

1. 单一职责原则(SRP)

其核心思想为:一个类,最好只做一件事,只有一个引起它的变化。

一个类,最好有且仅有一个引起它变化的原因。

举个栗子,职员类里包括了普通员工、经理、老板,那类中势必需要用if else来区分判断,而且无论是这三种职员的需求发生变化,都会影响到整个职员类。

按照“单一职责原则”,将普通员工、经理、老板分别建一个类,既不用if else加以区分,也不会在修改某个职员类别的时候影响另一个。

2. 开放封闭原则(OCP)

其核心思想是:软件实体应该是可扩展的,而不可修改的。

一个类,可以扩展(添加属性和功能),但是不要修改已经写好的属性和方法。

实现开开放封闭原则的核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。

打个简单的比方,X的大舅二舅都是他舅,是有血缘关系的舅舅,如果突然冒出来一个跟他有血缘关系的三舅,那也是他舅舅。同时也不能改变他大舅和二舅的亲缘关系。

3.里氏替换原则(LSP)

其核心思想是:子类必须能够替换其基类。

类A是类B的父类,那么在进行调用的时候,类A可以引用类B,但是反过来不行。

其实可以粗糙地理解为,类A就是对外提供一个接口,具体的实现在类B中。

实现的方法是面向接口编程:将公共部分抽象为基类接口或抽象类,通过Extract Abstract Class,在子类中通过覆写父类的方法实现新的方式支持同样的职责。

也就是说,其实里氏替换原则是继承和多态的综合体现。

4. 依赖倒置原则(DIP)

其核心思想是:依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。

在对客观事物抽象成逻辑实体时,可以先思考,同类事物的共性是什么,将这个共性作为这类事物的“高层模块”,若干不同的客观事物作为“底层模块”在依赖”高层“之后,对共性进行特定描述。

举个栗子,苹果跟西瓜都是水果,水果的共同属性是水分、糖分。在这里,”水果“作为高层模块,其属性可以在描述“苹果”和“西瓜”的时候使用,所以“苹果”“西瓜”在此是“底层模块”。

5. 接口隔离原则

其核心思想是:使用多个小的专门的接口,而不要使用一个大的总接口。

接口中定义属性和需要子类实现的方法,实现类必须完全实现接口的所有方法、属性。为什么要接口隔离呢?目的有二:

  • 避免引用接口的类,需要实现其实用不到的接口方法、属性。
  • 避免当接口修改的时候,有一连串的实现类需要更改。

分离的手段主要有以下两种:1、委托分离,通过增加一个新的类型来委托客户的请求,隔离客户和接口的直接依赖,但是会增加系统的开销。2、多重继承分离,通过接口多继承来实现客户的需求,这种方式是较好的。

  • 委托分离,不直接使用原先的接口,可以用另外增加一个新的接口或类来实现需求。
  • 多重继承分离,JDK源码、Spring框架使用了这种方式,后续的JDK源码解析系列会提及,好奇的朋友可以查看集合类的结构。

结语

用文字表述出来比单纯理解难多了,但在写博客的同时,也推进自己思考。五大基本原则作为原则,在实际应用中必定会有妥协,为他人所用,予他人便利,才是它们存在的意义。

附加:

网上有很多说法是,面向对象有四个特征:封装、继承、多态、抽象。为什么小编没有在这里写出来?

因为无论面向对象还是面向过程,将具体事物抽象成类,或者将问题解决过程抽象出来,这一步是少不了的。抽象已经融入到面向对象和面向过程的DNA里面了,所以个人认为,这一点是没必要分出来的,所以也就没写出来了。

原文地址:https://www.cnblogs.com/NYfor2018/p/12442025.html

时间: 2024-08-26 07:41:11

面向对象的三大基本特征和五大基本原则的相关文章

面向对象的三大基本特征,五大基本原则

网上的讲解很多,但大都类似,这里进行转载整理.三大基本特征是理解五大基本原则的前提. 一.三大基本特征:封装.继承.多态 1.封装 封装就是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别,将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员. 封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员. 面相对象的不

PHP-面向对象的三大基本特征和五大基本原则的概念

三大特征:封装.继承.多态 1.封装 封装,就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 封装是面向对象的特征之一,是对象和类概念的主要特性. 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体.在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问.通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分. 2.继承 继承,是指可以让某个类型的对象获得另

面向对象的三大特征和五大基本原则

http://blog.csdn.net/zhang2531/article/details/52052453 面向对象的编程方法是为了解决系统的可维护性.可扩展性.可重用性.系统的需求是变化的,如果需求增加或者修改,就需要全部推到重来是效率低下的:不应该重复造轮子,你写一个单链表,他写一个,这样重复的工作是可以消除掉的. 面向对象与面向过程的区别 前者是纪传体,如史记按人物线索写,后者是编年史,按年代写.BS谈普通类的优点和OOP的伟大之处.面向过程是构造数据加方法(算法+数据=程序),面向对

面向对象三大基本特性和五大基本原则

透切理解面向对象三大基本特性是理解面向对象五大基本原则的基础. 三大特性是:封装,继承,多态 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.封装是 面向对象的特征之一,是对象和类概念的主要特性. 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体.在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问.通过这种方 式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了

面向对象三大基本特性,五大基本原则

三大特性是: 封装 继承 多态 五大基本原则: 单一职责原则SRP(Single Responsibility Principle) 开放封闭原则OCP(Open-Close Principle) 替换原则(the Liskov Substitution Principle LSP) 依赖原则(the Dependency Inversion Principle DIP) 接口分离原则(the Interface Segregation Principle ISP) 详细: 所谓封装,也就是把客

【java基础】面向对象的三大基本特征之-------继承

面向对象的三大特征:封装,继承,多态 java通过extends关键字来实现继承,而且是单继承,一个子类只可以有一个直接父类,但是父类还可以有父类... java.long.Object是所有类的父类,如果一个类没有声明继承于谁,那么默认就是继承于java.long.Object类 通过继承,子类可以获得父类的全部的属性和方法,同时进行拓展. 代码示例: 1 package extendss; 2 3 /** 4 * 类的继承演示代码 5 * 这是一个父类 train 火车类 6 * 默认继承于

深入理解面向对象的三大基本特征

我们都知道面向对象有三个基本特征:封装,多态和继承. 封装: 我先来援引一 位网友写的段子:基本的变量已经不再浮游于一大段一大段的程序中了,它们已经放弃了(其实是程序员不用这种方式了)这种自由自在的存在方式,而是安稳的寄 居于庞大而蹒跚的“对象”内部,与外界隔开来,通过迂回曲折的间接途径与外部世界联系和通信.而这些对象,就是它们这些基本变量的生存机器! 在面向过程的开发中,变量被暴露在整个程序中,不小心的一个修改就可能导致整个程序出错. 所以封装有利于我们让自己的程序更健壮.这个大家很好理解.

面向对象 三个基本特征 五项基本原则

三个基本元素: 1. 封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象. 2. 继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继 承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类).派生类可以从它的基类那里继承方法和实例变

C#面向对象的三大基本特征

封装: 封装是指将数据与具体操作的实现代码放在某个对象内部,使这些代码的实现细节不被外界发现(可以使代码更加安全),外界只能通过接口使用该对象,而不能通过任何形式修改对象内部实现,正是由于封装机制,程序在使用某一对象时不需要关心该对象的数据结构细节及实现操作的方法.使用封装能隐藏对象实现细节,使代码更易维护,同时因为不能直接调用.修改对象内部的私有信息,在一定程度上保证了系统安全性. 继承: 继承来源于现实世界,一个最简单的例子就是孩子会具有父母的一些特征,即每个孩子都会继承父亲或者母亲的某些特