深入理解面向过程与面向对象的思想差异与各自特色

时间:2022-03-11 15:26:16

一、什么是面向过程

面向过程是一种思维方式。当试图通过面向过程解决问题时,我们的关注点在于问题解决的流程,重在这个过程的控制,需要用大量的模块(模块化的思想源自于硬件,在C语言中是函数)将大问题拆解,程序员通过控制模块的执行顺序以解决问题。

举个例子,当我们解决一个“如何将大象装入冰箱?”的问题时,最简单的解决思路是面向过程解决:
1、关注过程,将大问题拆解为小问题,实现每个小问题的解决方法
a、打开冰箱门
b、将大象装入冰箱
c、关闭冰箱门
2、通过控制代码,控制模块执行,执行顺序为a->b->c,问题解决。

在日常生活或者说日常编程中,简单的问题用面向过程的思路解决,更加直接有效,但是当问题的规模稍大时,如要描述三万个人吃饭的问题,或者要构建一个航空母舰模型的时候,用面向过程的思想是远远不够的。而且面向过程程序的代码复用性、可扩展性、可移植性、灵活性、健壮性都会在处理大规模问题中出现问题。

二、什么是对象?什么是面向对象的思想?有什么好处?

1、对象与类

万事万物都是对象,对象是自然界的任一个体,比如一本书、一支笔,一片叶子等,而对象和对象间是有相似之处的,比如书(每本书都是一个对象)都是由纸做成的,都印着内容(性质上的相似点),都是用来看的(行为上的相似点),将这些相似之处抽象出来就是类(抽象这个词很难懂,那么说成是分类、提取出事物的共同要素更易理解),类的实例就是对象。

2、面向对象思想

面向对象最基本的要素就是抽象,比如刚刚提到的描述三万人吃饭的问题,首先要解决的是三万个人描述的问题,三万个人都是人,有鼻子有眼,都要吃饭,那我们把“人”抽象出来,他们的共性就提取出来了,描述起来就容易太多了。每个人的差异交给继承多态去做吧。而吃饭的过程就很简单了,用面向过程的思想解决就好了,所以面向对象是建立在面向过程基础上解决问题的,面向对象更适合解决较复杂的问题。

刚刚提到的构建航空母舰模型的问题,面向过程肯定是不行的。而用面向对象也有一定问题,因为一个航空母舰是由太多太多组件构成的,每个组件都是一个对象的话,那么程序需要控制太多对象,而对象和对象的依赖关系也极其复杂,再通过程序控制对象的生命周期就不现实了。这时我们就想如果有一个靠谱的第三方为为我们管理对象就好了,这就出现了大名鼎鼎的spring了,它通过将对象的依赖关系存入xml中,在我们需要某个对象的时候,spring容器为我们创建,并将对象间的依赖关系注入(依赖注入)。对象的控制权由程序转向了spring容器,也就是IOC(控制反转)。

3、面向对象的特性除了抽象,还有封装、继承、多态等特性

封装是一种把代码和代码所操作的数据捆绑在一起,使这两者不受外界干扰和误用的机制。封装可被理解为一种用做保护的包装器,以防止代码和数据被包装器外部所定义的其他代码任意访问。对包装器内部代码与数据的访问通过一个明确定义的接口来控制。封装代码的好处是每个人都知道怎样访问代码,进而无需考虑实现细节就能直接使用它,同时不用担心不可预料的副作用。

在JAVA中,最基本的封装单元是类,一个类定义着将由一组对象所共享的行为(数据和代码)。一个类的每个对象均包含它所定义的结构与行为,这些对象就好象是一个模子铸造出来的.所以对象也叫做类的实例.

在定义一个类时,需要指定构成该类的代码与数据。特别是,类所定义的对象叫做成员变量或实例变量,操作数据的代码叫做成员方法。方法定义怎样使用成员变量,这意味着类的行为和接口要由操作实例数据的方法来定义.。

由于类的用途是封装复杂性,所以类的内部有隐藏实现复杂性的机制。所以JAVA中提供了私有和公有的访问模式,类的公有接口代表外部的用户应该知道或可以知道的每件东西。私有的方法数据只能通过该类的成员代码来访问。这就可以确保不会发生不希望的事情.。

4.继承

继承是指一个对象从另一个对象中获得属性的过程。是面向对象程序设计的三大原则之二,它支持按层次分类的概念。例如,波斯猫是猫的一种,猫又是哺乳动物的一种,哺乳动物又是动物的一种。如果不使用层次的概念,每个对象需要明确定义各自的全部特征。通过层次分类方式,一个对象只需要在它的类中定义是它成为唯一的 各个属性,然后从父类中继承它的通用属性。因此,正是由于继承机制,才使得一个对象可以成为一个通用类的一个特定实例。一个深度继承的子类将继承它在类层次中的每个祖先的所有属性,增强了代码的可重用行。而且子类可以通过重写父类方法或者定义自身的方法,使其拥有自身的特色,使程序的可扩展性大大提升

继承与封装可以互相作用。如果一个给定的类封装了某些属性,它的任何子类将会含有同样得属性,另加各个子类所有得属性.这是面向对象程序在复杂性上呈线性而非几何增长的一个重要概念。新的子类继承其所有祖先的所有属性。子类和系统中的其他代码不会产生无法预料的交互作用.

5.多态

多态是指一个方法只能有一个名称,但可以有许多形态,也就是程序中可以定义多个同名的方法,用”一个接口,多个方法”来描述。可以通过方法的参数和类型引用.。
运行时多态是指:在程序运行过程中才决定用哪个方法,多态性是允许你将父类对象设置成和它的一个或多个子对象相等的技术,赋值后,父对象就可以根据当前赋值给它的子对象的特性运作。

6.封装,继承,多态的组合使用 (总结)

在由封装,继承,多态所组成的环境中,程序员可以编写出比面向过程模型更方便、健壮,更具扩展性的程序。

封装:对于接口使用者,封装可以封装复杂性,使用者不必知道实现细节即可使用;对于程序员,通过封装可以防止代码和数据被外部所定义的其他代码任意访问,增强了代码的健壮性;并且不必修改公有接口的代码即可实现程序的移植。

继承:经过仔细设计的类层次结构是代码重用与扩展的基础。

多态:能使程序员开发出简洁,易懂,易修改,更灵活的代码。

例如:汽车 从继承的角度看,驾驶员都依靠继承性来驾驶不同类型(子类)的汽车,无论这辆车是轿车还是卡车,是奔驰牌还是菲亚特牌,驾驶员都能找到方向盘,手刹,换档器。经过一段时间驾驶后,都能知道手动档与自动档之间的差别,因为他们实际上都知道这两者的共同超类:传动装置.。

从封装的角度看,驾驶员总是看到封装好的特性。刹车隐藏了许多复杂性,其外观如此简单,用脚就能操作它。发动机,手刹,轮胎大小的实现对与刹车类的定义没有影响.。

从多态的角度看,刹车系统有正锁反锁之分,驾驶员只用脚踩刹车停车,同样的接口可以用来控制若干种不同的实现(正锁或反锁).

这样各个独立的构件才被转换为汽车这个对象的。同样,通过使用面向对象的设计原则,程序员可以把一个复杂程序的各个构件组合在一起,形成一个一致,健壮,可维护的程序。

参考:
1、《Java编程思想》第一章对象导论
2、 百度百科与百度知道热心网友
3、 尚学堂博文