面向对象程序设计(英语:Object-oriented programming,缩写:OOP),指一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的集合。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。[1]

面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想,这与传统的思想刚好相反:传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,即对象。

目前已经被证实的是,面向对象程序设计推广了程序的灵活性和可维护性,并且在大型项目设计中广为应用。 此外,支持者声称面向对象程序设计要比以往的做法更加便于学习,因为它能够让人们更简单地设计并维护程序,使得程序更加便于分析、设计、理解。反对者在某些领域对此予以否认。

当我们提到面向对象的时候,它不仅指一种程序设计方法。它更多意义上是一种程序开发方式。在这一方面,我们必须了解更多关于面向对象系统分析和面向对象设计(Object Oriented Design,简称OOD)方面的知识。

目录

[隐藏]

  • 1 基本理论

    • 1.1 类
    • 1.2 对象
    • 1.3 方法(秩序;条例)
    • 1.4 消息传递
    • 1.5 继承
    • 1.6 封装性
    • 1.7 多态
    • 1.8 抽象性
  • 2 OOP名词释意
  • 3 面向对象的语言
    • 3.1 脚本中的OOP
  • 4 历史
  • 5 参考文献
  • 6 相关内容
  • 7 外部链接

基本理论[编辑]

一项由 Deborah J. Armstrong 进行的长达40年之久的计算机著作调查显示出了一系列面向对象程序设计的基本理论。它们是:

类[编辑]

类(Class)定义了一件事物的抽象特点。通常来说,定义了事物的属性和它可以做到的(它的行为)。举例来说,“狗”这个类会包含狗的一切基础特征,例如它的孕育、毛皮颜色和吠叫的能力。类可以为程序提供模版和结构。一个类的方法和属性被称为“成员”。 我们来看一段伪代码:


开始私有成员:孕育:毛皮颜色:公有成员:吠叫():
结束

在这串代码中,我们声明了一个类,这个类具有一些狗的基本特征。关于公有成员和私有成员,请参见下面的继承性一节。

对象[编辑]

对象(Object)是类的实例。例如,“狗”这个类列举狗的特点,从而使这个类定义了世界上所有的狗。而莱丝这个对象则是一条具体的狗,它的属性也是具体的。狗有皮毛颜色,而莱丝的皮毛颜色是棕白色的。因此,莱丝就是狗这个类的一个实例。一个具体对象属性的值被称作它的“状态”。(系统给对象分配内存空间,而不会给类分配内存空间,这很好理解,类是抽象的系统不可能给抽象的东西分配空间,对象是具体的)

假设我们已经在上面定义了狗这个类,我们就可以用这个类来定义对象:

定义莱丝
莱丝.毛皮颜色:=棕白色
莱丝.吠叫()

我们无法让狗这个类去吠叫,但是我们可以让对象“莱丝”去吠叫,正如狗可以吠叫,但没有具体的狗就无法吠叫。

方法(秩序;条例)[编辑]

方法(Method,可看成能力)是定义一个类可以做的,但不一定会去做的事。作为一条狗,莱丝是会叫的,因此“吠叫()”就是它的一个方法。与此同时,它可能还会有其它方法,例如“坐下()”,或者“吃()”。 对一个具体对象的方法进行调用并不影响其它对象,正如所有的狗都会叫,但是你让一条狗叫不代表所有的狗都叫。 如下例:

定义莱丝
定义泰尔
莱丝.吠叫()

则泰尔是会叫——但没有吠叫,因为这里的吠叫只是对对象“莱丝”进行的。

消息传递[编辑]

一个对象通过接受消息、处理消息、传出消息或使用其他类的方法来实现一定功能,这叫做消息传递机制(Message Passing)。

继承[编辑]

继承性(Inheritance)是指,在某种情况下,一个类会有“子类”。子类比原本的类(称为父类)要更加具体化,例如,“狗”这个类可能会有它的子类“牧羊犬”和“吉娃娃犬”。在这种情况下,“莱丝”可能就是牧羊犬的一个实例。子类会继承父类的属性和行为,并且也可包含它们自己的。我们假设“狗”这个类有一个方法叫做“吠叫()”和一个属性叫做“毛皮颜色”。它的子类(前例中的牧羊犬和吉娃娃犬)会继承这些成员。这意味着程序员只需要将相同的代码写一次。 在伪代码中我们可以这样写:

牧羊犬:继承定义莱丝牧羊犬
莱丝.吠叫()    /* 注意这里调用的是狗这个类的吠叫方法。 */

回到前面的例子,“牧羊犬”这个类可以继承“毛皮颜色”这个属性,并指定其为棕白色。而“吉娃娃犬”则可以继承“吠叫()”这个方法,并指定它的音调高于平常。子类也可以加入新的成员,例如,“吉娃娃犬”这个类可以加入一个方法叫做“颤抖()”。设若用“牧羊犬”这个类定义了一个实例“莱丝”,那么莱丝就不会颤抖,因为这个方法是属于吉娃娃犬的,而非牧羊犬。事实上,我们可以把继承理解为“是”。例如,莱丝“是”牧羊犬,牧羊犬“是”狗。因此,莱丝既得到了牧羊犬的属性,又继承了狗的属性。 我们来看伪代码:

吉娃娃犬:继承
开始公有成员:颤抖()
结束
类牧羊犬:继承定义莱丝牧羊犬
莱丝.颤抖()    /* 错误:颤抖是吉娃娃犬的成员方法。 */

当一个类从多个父类继承时,我们称之为“多重继承”。多重继承并不总是被支持的,因为它很难理解,又很难被好好使用。

封装性[编辑]

具备封装性(Encapsulation)的面向对象程序设计隐藏了某一方法的具体执行步骤,取而代之的是通过消息传递机制传送消息给它。因此,举例来说,“狗”这个类有“吠叫()”的方法,这一方法定义了狗具体该通过什么方法吠叫。但是,莱丝的朋友蒂米并不需要知道它到底如何吠叫。 从实例来看:

/* 一个面向过程的程序会这样写: */
定义莱丝
莱丝.设置音调(5)
莱丝.吸气()
莱丝.吐气()/* 而当狗的吠叫被封装到类中,任何人都可以简单地使用: */
定义莱丝
莱丝.吠叫()

封装是通过限制只有特定类的实例可以访问这一特定类的成员,而它们通常利用接口实现消息的传入传出。举个例子,接口能确保幼犬这一特征只能被赋予狗这一类。通常来说,成员会依它们的访问权限被分为3种:公有成员、私有成员以及保护成员。有些语言更进一步:Java可以限制同一包内不同类的访问;C#和VB.NET保留了为类的成员聚集准备的关键字:internal(C#)和Friend(VB.NET);Eiffel语言则可以让用户指定哪个类可以访问所有成员。

多态[编辑]

多态(Polymorphism)是指由继承而产生的相关的不同的类,其对象对同一消息会做出不同的响应。[2]举例来说,狗和鸡都有“叫()”这一方法,但是调用狗的“叫()”,狗会吠叫;调用鸡的“叫()”,鸡则会啼叫。 我们将它体现在伪代码上:


开始公有成员:叫()开始吠叫()结束
结束类
开始公有成员:叫()开始啼叫()结束
结束定义莱丝
定义鲁斯特
莱丝.叫()
鲁斯特.叫()

这样,同样是叫,莱丝和鲁斯特做出的反应将大不相同。多态性的概念可以用在运算符重载上,本文不再赘述。

抽象性[编辑]

抽象(Abstraction)是简化复杂的现实问题的途径,它可以为具体问题找到最恰当的类定义,并且可以在最恰当的继承级别解释问题。举例说明,莱丝在大多数时候都被当作一条狗,但是如果想要让它做牧羊犬做的事,你完全可以调用牧羊犬的方法。如果狗这个类还有动物的父类,那么你完全可以视莱丝为一个动物。

OOP名词释意[编辑]

编程范型 对于OOP的准确定义及其本意存在着不少争论。

通常,OOP被理解为一种将程序分解为封装数据及相关操作的模块而进行的编程方式。有别于其它编程方式,OOP中的与某数据类型相关的一系列操作都被有机地封装到该数据类型当中,而非散放于其外,因而OOP中的数据类型不仅有着状态,还有着相关的行为。OOP理论,及与之同名的OOP实践相结合创造出了新的一个编程架构;OOP思想被广泛认为是非常有用的,以致一套新的编程范型被创造了出来。(其它的编程范型例如函数式编程或过程式编程专注于程序运行的过程,而逻辑编程专注于引发程序代码执行的断言)

对面向模拟系统的语言(如:SIMULA 67)的研究及对高可靠性系统架构(如:高性能操作系统和CPU的架构)的研究最终导致了OOP的诞生。

面向对象的语言[编辑]

支持部分或绝大部分面向对象特性的语言即可称为基于对象的或面向对象的语言。

早期,完全面向对象的语言主要包括Smalltalk等语言,目前较为流行的语言中有Java、C#、Eiffel等。随着软件工业的发展,比较早的面向过程的语言在近些年的发展中也纷纷吸收了许多面向对象的概念,比如C->C++,C->Objective-C,BASIC->Visual Basic->Visual Basic .NET,Pascal->Object Pascal,Ada->Ada95。

脚本中的OOP[编辑]

近年来,面向对象的程序设计越来越流行于脚本语言中。Python和Ruby是创建在OOP原理的脚本语言,Perl和PHP亦分别在Perl 5和PHP 4时加入面向对象特性。

面向对象程序设计(维基百科)相关推荐

  1. 对面向对象程序设计(OOP)的认识

    前言 本文主要介绍面向对象(OO)程序设计,以维基百科的解释:面向对象程序设计(英语:Object-oriented programming,缩写:OOP),指一种程序设计范型,同时也是一种程序开发的 ...

  2. 什么是对象?什么是面向对象程序设计?面向对象语言有什么优点?

    在初学面向对象语言的时候,很多书都会有这样的句子–"一切都是对象".那么对象究竟是什么呢?是不是一切的事物都叫对象?但这里的对象并不是我们日常生活中的对象(事物),C#中我们把一个 ...

  3. [python学习] 简单爬取维基百科程序语言消息盒

    文章主要讲述如何通过Python爬取维基百科的消息盒(Infobox),主要是通过正则表达式和urllib实现:后面的文章可能会讲述通过BeautifulSoup实现爬取网页知识.由于这方面的文章还是 ...

  4. JAVA面向对象程序设计(第二版) 袁绍欣 第四章答案

    面向对象(上) 1.名词解释:构造方法.抽象 构造方法一般是用来初始化数据成员的,与类名相同,无返回值. 分为有参和无参数,当一个类中没有定义构造函数时,系统会给该类中加一个默认的空参数的构造函数,方 ...

  5. OpenMP - 维基百科,自由的百科全书

    OpenMP - 维基百科,自由的百科全书 OpenMP - 维基百科,自由的百科全书 OpenMP 维基百科,自由的百科全书 跳转到: 导航. 搜索 OpenMP(Open Multi-Proces ...

  6. JavaSE-Adventure(VII) Java OOP 面向对象程序设计

    JavaSE-Adventure(VII) Java & OOP 面向对象程序设计 CONTENTS JavaSE-Adventure(VII) Java & OOP 面向对象程序设计 ...

  7. 维基百科,自由的百科全书 正则表达式

    正则表达式 维基百科,自由的百科全书 跳转到: 导航, 搜索 跳过字词转换说明 汉漢 ▼ ▲ 正则表达式(英语:Regular Expression.regex或regexp,缩写为RE),也译为正规 ...

  8. Python Djang 搭建自动词性标注网站(基于Keras框架和维基百科中文预训练词向量Word2vec模型,分别实现由GRU、LSTM、RNN神经网络组成的词性标注模型)

    引言 本文基于Keras框架和维基百科中文预训练词向量Word2vec模型,分别实现由GRU.LSTM.RNN神经网络组成的词性标注模型,并且将模型封装,使用python Django web框架搭建 ...

  9. php面向对象程序设计,PHP面向对象程序设计类的定义与用法简单示例

    本文实例讲述了PHP面向对象程序设计类的定义与用法.分享给大家供大家参考,具体如下: class Person { private $name; private $sex; private $age; ...

最新文章

  1. 1亿以内素数的个数_ghpython_素数
  2. SmartNIC/DPU — 主流厂商
  3. Python 依赖库
  4. 使用log4j2免费分配日志记录
  5. 浅谈Spring测试框架+junit4单元测试原理
  6. 95-240-052-原理-State-MemoryStateBackend
  7. amos调节变量怎么画_AMOS 中验证性因素分析(CFA)
  8. 码云、coding拉取项目代码
  9. 【论文笔记】分层强化学习鼻祖:Feudal Reinforcement Learning 1993
  10. Onenote插件,云扩容
  11. 【Ubuntu】查询显卡型号
  12. 前端vs图片:0 为什么需要重视图片
  13. java文件写入不覆盖_java写入文件不覆盖写入_Java写入文件–用Java写入文件的4种方法...
  14. nmcli命令详解>>>创建热点,连接wifi,管理连接等
  15. sockaddr_in和sockaddr区别
  16. 搭建线上教学平台前,需要明确哪些问题?
  17. 全自动生成、设置课表壁纸【完结】
  18. 十二个“一”与耍猴(互动媒体技术作业)
  19. Shiro 下的principal 注意
  20. pycharm编辑器如何用鼠标滚轮随时放大缩小代码

热门文章

  1. 5款提高工作效率的无广告软件
  2. FE File Explorer Pro for mac v3.1.1文件管理器
  3. FreeRTOS任务通知 基于STM32
  4. openstack windows 10 image - windows 10 镜像制作
  5. 如何下载并找到学术论文期刊(针对学术期刊论文电机控制方向)---出处为王
  6. windows修改dns服务器,windowns中dns服务器配置与管理详解(多图)
  7. Ubuntu 16.04下源码安装Catkin
  8. 计算机中的cache相关知识
  9. HMM 5个基本元素 2个假设 3个问题
  10. Windows 10安装Oracle时出现报错:INS-13001环境不满足最低要求