理解面向对象

从接触java语言时,就已经知道了面向对象,对这个概念总是模模糊糊,理解也是零零散散,没有系统的去了解它。面向对象涉及编程思想以及一些方法论,本文不是深入的研究,而是从如下几个方面去理解一下。

什么是面向对象?

首先,面向对象是一种软件开发方法,是把构成问题的各个事物分解成各个对象,由各个对象协调解决这个问题或完成这项事务。建立对象的目的不是为了完成一个步骤,而是为了描述一个事物在解决问题的过程中经历的步骤和行为。对象作为程序的基本单位,将程序和数据封装其中,以提高程序的重用性,灵活性和可扩展性。对象之间相互独立而又互相调用。

可以把面向对象的思想和传统的编程思想(面向过程)进行比较加深理解:传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”。

举例说明一下,有一天公司老总找到某经理要一分关于某产品的市场调查报告,看看不同的经理是如何处理这件事情的。
经理A是一个能力比较强的人,做什么都喜欢亲力亲为,他的处理方式是这样的:

  • 第一步,制作市场调查的问题,想好调查的方案,也就是说做好市场调查的准备工作。
  • 第二步,找一天时间去市场上做调查,去那些上一步准备好的地方,问一些准备好的问题并记录。
  • 第三步,把调查的结果记录好后做一些统计,然后形成统计报表。

经理B比较笨,不会做报表,市场调查以前也没有接触过,不知道从何下手,于是他找人帮忙:

  • 第一步,找到下属同事甲帮忙做一份市场调查的方案。
  • 第二步,按照方案,自己实地调查并记录结果。
  • 第三步,找到同事乙,把自己的记录结果和要求告诉他,要他帮忙做一份统计报表。

经理C就非常懒了,但情商比较高,人缘比较好,他找到三个同事帮他完成了这项工作,他告诉同事甲他想要的东西,同事甲做好方案后告诉同事乙要按照方案去做市场调查,同事乙去做了市场调查后再把记录结果交给同事丙。这样经理丙就负责控制进度和把关就行了。

上面的例子中,不同的经理站在不同的角度去思考,最后完成任务的方式也不同。经理A和经理B都是传统的思考方式,按照流程一步一步做,经理B相对轻松,他第一步和第三步交给别人去做,在程序里面相当于写了个函数。经理C就聪明了,把事情交给甲乙丙三个对象,自己关注一下就行。在编程中,面向对象其实就是一种思考方式,这种思考方式可以提高程序的重用性,灵活性和可扩展性。

面向对象概念怎么来的?(背景)

早期的计算机编程是基于面向过程的方法,例如实现算术运算1+1+2 = 4,通过设计一个算法就可以解决当时的问题。随着计算机技术的不断提高,计算机被用于解决越来越复杂的问题。通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析、设计与编程。同时,面向对象能有效提高编程的效率,通过封装技术,消息机制可以像搭积木的一样快速开发出一个全新的系统。面向对象是指一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的集合。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。

面向对象是在结构化设计方法出现很多问题的情况下应运而生的。结构化设计方法求解问题的基本策略是从功能的角度审视问题域。它将应用程序看成实现某些特定任务的功能模块,其中子过程是实现某项具体操作的底层功能模块。在每个功能模块中,用数据结构描述待处理数据的组织形式,用算法描述具体的操作过程。面对日趋复杂的应用系统,这种开发思路某些方面逐渐暴露了一些弱点。比如说代码的可重用性,灵活性和扩展性等。这种开发思路增加了程序设计的复杂程度,而且背离了人们观察问题和解决问题的基本思路。使得应用程序的日后维护和扩展相当困难,甚至一个微小的变动,都会波及到整个系统。

面向对象的一些优势

面向对象的优势是相对于传统方式来讲的。

  • 代码重用性高。
  • 代码更加灵活。
  • 扩展性强,便于日后维护和扩展。
  • 更加贴近人们观察问题和解决问题的基本思路,可读性强。

面向对象的一些概念

类和对象

类是一个模板,它描述一类对象的行为和状态。对象是类的一个实例,有具体的状态和行为。比如狗是一个类,有大小、体重、毛色等状态,也有叫、跑等行为,他是一类对象(比如说二哈、阿拉斯加等)的模板,而对象指的是一个具体的狗,比如说你的宠物犬,它是白色的,体重30公斤等,叫起来像狼,跑起来疯疯癫癫的。

内聚

通俗的来讲,就是自己的东西自己保管,自己的事情自己做,只对外展现出状态和行为。就是封装的体现,程序 = 数据结构 + 算法。

耦合

在面向对象编程中,对象自身是内聚的,是保管好自己的数据,完成好自己的操作的,而对外界呈现出自己的状态和行为。但是,没有绝对的自力更生,对外开放也是必要的!一个对象,往往需要跟其他对象打交道,既包括获知其他对象的状态,也包括仰赖其他对象的行为,而一旦这样的事情发生时,我们便称该对象依赖于另一对象。只要两个对象之间存在一方依赖一方的关系,那么我们就称这两个对象之间存在耦合。比如妈妈和baby,妈妈要随时关注baby的睡、醒、困、哭、尿等等状态,baby则要仰赖妈妈的喂奶、哄睡、换纸尿裤等行为,从程序的意义上说,二者互相依赖,因此也存在耦合。首先要说,耦合是必要的,但程序耦合度越高越不灵活。

面向对象主要特征

面向对象三大特征,封装、继承与多态。

封装

封装也称为信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封 装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他部分只有通过包裹在数据外面的被授权的操作来与这个抽象数据类型交流与交互。也就是说,用户无需知道对象内部方法的实现细节,但可以根据对象提供的外部接口(对象名和参数)访问该对象。
好处:

  1. 实现了专业的分工。将能实现某一特定功能的代码封装成一个独立的实体后,各程序员可以在需要的时候调用,从而实现了专业的分工。
  2. 隐藏信息,实现细节。通过控制访问权限可以将可以将不想让客户端程序员看到的信息 隐藏起来,如某客户的银行的密码需要保密,只能对该客户开发权限。

继承

继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。

多态

是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
实现多态,有两种方式,覆盖和重载。覆盖和重载的区别在于,覆盖在运行时决定,重载是在编译时决定。并且覆盖和重载的机制不同,例如在 Java 中,重载方法的签名必须不同于原先方法的,但对于覆盖签名必须相同。

显示 Gitment 评论