在初学面向对象语言的时候,很多书都会有这样的句子–“一切都是对象”。那么对象究竟是什么呢?是不是一切的事物都叫对象?但这里的对象并不是我们日常生活中的对象(事物),C#中我们把一个类的实例叫做对象,这里的对象并非只是具体的事物,它也可以是一种规则、计划或事件。在我看来,对象就是对事物共同特性及行为的抽象及总结。
下面引用维基百科上对对象的定义:

在计算机科学中,对象(英语:object),台湾译作物件,是一个存储器地址,其中拥有值,这个地址可能有标识符指向此处。对象可以是一个变量,一个数据结构,或是一个函数。是面向对象(Object Oriented)中的术语,既表示客观世界问题空间(Namespace)中的某个具体的事物,又表示软件系统解空间中的基本元素。
在软件系统中,对象具有唯一的标识符,对象包括属性(Properties)和方法(Methods),属性就是需要记忆的信息,方法就是对象能够提供的服务。在面向对象(Object Oriented)的软件中,对象(Object)是某一个类(Class)的实例(Instance)。

那么所谓面向对象编程,就是面向类和实例的编程方法吗?这样的理解似乎有些片面。面向对象并不是单纯的面向类和实例编程,更不是面向一切事物(一切都是对象)编程。在编程世界里提到面向对象更多的是指一种设计及编程的思想及开发方式,愚以为如何将问题抽象成对象并编码实现的过程便是面向对象编程,而不是写一个类实现一个实例就是面向对象编程。
为了防止大家跟我在错误的道路上越走越远,下面同样粘一段维基百科的定义:

面向对象程序设计(英语:Object-oriented
programming,缩写:OOP)是种具有对象概念的程序编程范型,同时也是一种程序开发的方法。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象[1][2]。

面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想,这与传统的思想刚好相反:传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,即对象。目前已经被证实的是,面向对象程序设计推广了程序的灵活性和可维护性,并且在大型项目设计中广为应用。此外,支持者声称面向对象程序设计要比以往的做法更加便于学习,因为它能够让人们更简单地设计并维护程序,使得程序更加便于分析、设计、理解。反对者在某些领域对此予以否认。

当我们提到面向对象的时候,它不仅指一种程序设计方法。它更多意义上是一种程序开发方式。在这一方面,我们必须了解更多关于面向对象系统分析和面向对象设计(Object
Oriented Design,简称OOD)方面的知识。许多流行的编程语言是面向对象的,它们的风格就是会透由对象来创出实例。

重要的面向对象编程语言包含Common
Lisp、Python、C++、Objective-C、Smalltalk、Delphi、Java、Swift、C#、Perl、Ruby 与
PHP等。

支持部分或绝大部分面向对象特性(类和实例、封装性、继承、多态)的语言即可称为基于对象的或面向对象的语言。Java跟C#是目前最流行的两门面向对象语言。
从一开始的面向过程(Procedure Oriented,是一种以过程为中心的编程思想),到之后面向对象逐步成为主流,面向对象语言开始占据历史舞台。一开始面向对象的程序其实并非是面向对象语言写出来的,使用面向过程的语言也可以写出面向对象的程序,只是实现比较曲折,所以后来才会有层出不穷的面向对象语言。相较于面向过程及函数式编程。面向对象语言可以归类为:

  1. 基于对象的程序设计语言;
  2. 面向对象的程序设计语言。

面向对象编程具有以下优点:

  1. 易维护
    采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的。

  2. 易扩展
    通过继承,我们可以大幅减少多余的代码,并扩展现有代码的用途;
    我们可以在标准的模块上(这里所谓的”标准”指程序员之间彼此达成的协议)构建我们的程序,而不必一切从头开始。这可以减少软件开发时间并提高生产效率;

  3. 模块化
    封装可以定义对象的属性和方法的访问级别,通过不同的访问修饰符对外暴露安全的接口,防止内部数据在不安全的情况下被修改。这样可以使程序具备更高的模块化程度,方便后期的维护和修改。
    同时,面向对象语言允许一个对象的多个实例同时存在,而且彼此之间不会相互干扰;

  4. 方便建模
    虽然面向对象语言中的对象与现实生活中的对象并不是同个概念,但很多时候,往往可以使用现实生活中对象的概念抽象后稍作修改来进行建模,这大大方便了建模的过程。(但直接使用现实中的对象来建模有时会适得其反)。

以上就是笔者对面向对象的一些理解,欢迎交流。

更多推荐

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