面向对象编程及面向对象编程语言的关键就是理解其四大特性:封装、抽象、继承、多态。

1. 封装(Encapsulation)

所谓封装性,封装也叫做信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式(或者叫函数)来访问内部信息或者数据。

从Java Entity 类的结构上分析,类的成员变量都有get/set方法,而类变量本身都是private私有的。外部仅能通过 set/get 公共方法去操作成员变量,属性不能被直接修改,避免了数据不一致的问题发生。这里也就将该属性的方法和业务细节做了隐藏,使用者不需要了解详细的业务逻辑,只需要根据方法名就知道该方法的作用从而去调用即可。

2. 抽象(Abstraction)

抽象讲的是如何隐藏方法的具体实现,让调用者只需要关心方法提供了哪些功能,并不需要知道这些功能是如何实现的。
Java 中的使用接口类( interface 关键字语法)或者抽象类( abstract 关键字语法)这两种语法机制,来实现抽象这一特性。
举例说,类A是一个interface修饰的接口类,有个save()方法,类B是个普通类,它实现了类A以及重写了save() 方法。
这里我们利用 Java 中的 interface 接口语法来实现抽象特性。调用者在使用save()方法的时候,只需要了解类A这个接口类暴露了哪些方法就可以了,不需要去查看 PictureStorage 类里的具体实现逻辑。
抽象作为一个非常宽泛的设计思想,在代码设计中,起到非常重要的指导作用。很多设计原则都体现了抽象这种设计思想,比如基于接口而非实现编程、开闭原则(对扩展开放、对修改关闭)、代码解耦(降低代码的耦合性)等。
换一个角度来考虑,我们在定义(或者叫命名)类的方法的时候,也要有抽象思维,不要在方法定义中,暴露太多的实现细节,以保证在某个时间点需要改变方法的实现逻辑的时候,不用去修改其定义

3. 继承(Inheritance)

继承是用来表示类之间的is-a 关系,比如猫是一种哺乳动物。从继承关系上来讲,继承可以分为两种模式,单继承和多继承。单继承表示一个子类只继承一个父类,多继承表示一个子类可以继承多个父类,比如猫既是哺乳动物,又是爬行动物。

编程语言提供特殊的语法机制来支持继承的特性,比如 Java 使用extends 关键字来实现继承,C++ 使用冒号(class B : public A),Python 使用paraentheses(),Ruby 使用 <。不过,有些编程语言只支持单继承,不支持多重继承,比如 Java、PHP、C#、Ruby 等,而有些编程语言既支持单重继承,也支持多重继承,比如C++、Python、Perl 等。

继承最大的一个好处就是代码复用。假如两个类有一些相同的属性和方法,我们就可以将这些相同的部分,抽取到父类中,让两个子类继承父类。这样,两个子类就可以重用父类中的代码,避免代码重复写多遍。

4. 多态(Polymorphism)

多态是指,子类可以替换父类,在实际的代码运行过程中,调用子类的方法实现。
例如:类B继承类A,并重写类A中的方法;此时,类A为父类,类B为子类。
多态这种特性也需要编程语言提供特殊的语法机制来实现。
  1. 第一个语法机制是编程语言要支持父类对象可以引用子类对象,也就是 B b = new A() ;
  2. 第二个语法机制是编程语言要支持继承,也就是类B能使用类似  "extends B" 的语法;
  3. 第三个语法机制是编程语言要支持子类可以重写(override)父类中的方法。

对于多态特性的实现方式,除了利用“继承加方法重写”这种实现方式之外,我们还有其他两种比较常见的的实现方式,一个是利用接口类语法,另一个是利用 duck-typing 语法。不过,并不是每种编程语言都支持接口类或者 duck-typing 这两种语法机制,比如 C++就不支持接口类语法,而 duck-typing 只有一些动态语言才支持,比如 Python、JavaScript 等。

什么是 duck-typing 语法?

只要两个类具有相同的方法,就可以实现多态,并不要求两个类之间有任何关系,这就是所谓的 duck-typing,是一些动态语言所特有的语法机制。而像 Java 这样的静态语言,通过继承实现多态特性,必须要求两个类之间有继承关系,通过接口实现多态特性,类必须实现对应的接口。

多态的意义:多态特性能提高代码的可扩展性和复用性。

设计模式学习笔记(四)封装、继承、多态、抽象能解决什么问题?相关推荐

  1. C++学习笔记:(五)继承 多态

    目录 7.组合.继承与多态性 7.1 组合 7.2 继承 7.3继承和组合 7.4构造与析构顺序 7.5派生类重载基类函数的访问 7.6多态性&虚函数 7.7纯虚函数和抽象基类 7.8 多重继 ...

  2. C++学习笔记系列之继承多态

    一.移动语义 1.右值引用      有一种机制,可以在语法层面识别出临时对象,在使用临时对象构造新对象(拷贝构造)的时候,将临时对象所持有的资源『转移』到新的对象中,就能消除这种不必要的拷贝. 2. ...

  3. 设计模式学习笔记(一):抽象工厂

    定义: 用于提供一个不需要指定具体的类就能去创建一系列相互关联的对象的接口. UML图: 参与者: 这种设计模式的参与者: 1.抽象工厂(AbstractFactory):声明一个创建抽象产品操作的接 ...

  4. 面向对象的四大特征 封装 继承 多态 抽象

    1.封装 广义: 类 方法 包 的定义本身就是一种封装 狭义: 在设计一个类的时候 将所有的属性设置为私有的 并对各个私有的属性设计相应的 存/取方法 来完成对属性的使用 私有化只能代表封装的特性 可 ...

  5. (C++学习笔记四)封装的使用

    六.封装的使用 1.代码 : #include<iostream> using namespace std;//#define PI 3.1415926 const double PI = ...

  6. c语言编程 菲薄拉,C语言设计模式-封装-继承-多态

    快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...

  7. 步步为营 .NET 设计模式学习笔记系列总结

    设计模式我从开篇到23种设计模式的讲解总共花了进两个月的时间,其间有很多读者给我提出了很好的建议,同时也指出了我的不足,对此我表示感谢,正是由于很多读者的支持我才能坚持的写到最后.在此表示我真诚的谢意 ...

  8. C++学习笔记【封装、继承、多态】

    C++学习笔记 [封装.继承.多态] 个人通过学习C++,手打出了一份27000字C++笔记,包括封装继承多态等面向对象的思想:笔记中包含了大量的代码案例对每个重要的知识点进行了代码演示,通过理论和实 ...

  9. 大数据笔记8—java基础篇4(面向对象-封装-继承-多态)

    面向对象 一.面向对象 1.面向过程 1.2.举例 1.3.总结 二.面向对象 1.简述 2.举例 3.思想特点 2.1.类的定义格式 2.1.1.简述 2.2.2.格式 2.3.3.示例 三.类的使 ...

  10. 设计模式学习笔记——抽象工厂(Abstract Factory)模式

    设计模式学习笔记--抽象工厂(Abstract Factory)模式 @(设计模式)[设计模式, 设计模式中文名, 设计模式英文名] 设计模式学习笔记抽象工厂Abstract Factory模式 基本 ...

最新文章

  1. 毕业十年后,我忍不住出了一份程序员的高考试卷
  2. 高效整洁CSS代码原则
  3. Spring Security基于角色的权限管理
  4. SAP UI5 初学者教程之十四 - 嵌入视图的使用方式试读版
  5. 在pom.xml中配置nexus上传地址
  6. Centos系统修改远程端口
  7. matlab设置固定的窗宽窗位,如何设定窗宽窗位,附正常人体组织CT值
  8. Browserslist: caniuse-lite is outdated. Please run next command npm update caniuse-lite browserslis
  9. Nexus简介及小白使用IDEA打包上传到Nexus3私服详细教程
  10. Sublime 中快速打开网页
  11. 数据分析可视化常用图介绍以及相关代码实现(箱型图、Q-Q图、Kde图、线性回归图、热力图)
  12. mixin 和 mixins 区别 ?
  13. 如何把手机app的视频下载到手机上?网页上的视频怎么下载?
  14. 【idea敲代码没有提示解决办法】
  15. android手机性能,手机性能排行榜2018前十名(安卓)
  16. jsp与servlet数据交互出现null或???解决方案
  17. Android视频播放器架构接口的设计
  18. 免安装Oracle客户端和PL/SQL
  19. 校区多,客情管理难?看中进教育使用明道云的新解法
  20. javascript制作省市联动等类似二级目录

热门文章

  1. 佳能2545i打印机驱动安装问题
  2. IP地址,同一网段,子网掩码,默认网关,添加路由
  3. vue跳转后不记录历史记录
  4. Flutter页面布局:Flutter AspectRatio、Card卡片组件、卡片图文列表
  5. 学习架设传奇入门必读的好文章
  6. CT窗口技术的选择与应用
  7. java计算机毕业设计家政服务管理系统MyBatis+系统+LW文档+源码+调试部署
  8. oracle四舍五入的函数,使用Oracle CEIL函数进行万位四舍五入
  9. wkwebview 文件服务器,WKWebView 的缓存策略
  10. 怎样查看Office2010的安装位置