想要理解面向对象,那么就要先知道面向过程。
一、面向过程
狭义上讲,“面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。广义上说,“面向过程”是一种解决问题的思想。举个例子,将大象装进冰箱里:
第一步:将冰箱门打开。
第二步:将大象装进冰箱。
第三步:将冰箱门关闭。
上述例子表明,面向过程强调的是动作,也就是说我们更为注重的是这一过程中涉及的行为——或者说功能。当我们通过不停的调用不同的功能,并通过这些功能一步一步地执行来完成某个程序时,我们就说这是面向过程的。面向过程其实是最为实际的一种思考方式,就算是面向对象的方法也是含有面向过程的思想.可以说面向过程是一种基础的方法。典型的面向过程的编程语言:Basic、C等。
二、面向对象
面向对象(Object-oriented Programming,OOP)也是一种编程思想,事实上,面向过程是面向对象的基础。我们常说的面向对象的概念是相对于上述早期的面向过程而言的。
对于前述冰箱的例子,我们通过观察发现,打开\关闭冰箱门,以及存储,这些其实都是冰箱所具有的功能。这样我们就可以将上述的各种功能都定义到冰箱这一类事物中。而冰箱是实实在在存在的事物,我们将这种现实存在的事物称为对象。当我们把需要的功能定义到某一类事物(对象)中后,拥有了这个事物(对象),就拥有了它所拥有的所有功能。这就是对面向对象的一个简单的理解。
现在做一个对比:
面向过程: 面向对象:
打开冰箱 冰箱.打开
存储进冰箱 冰箱.存储
关闭冰箱 冰箱.关闭
可以看到,面向过程强调的是动作,面向对象强调的是对象。那么,也就可以看出面向过程的弊端了:随着计算机技术的不断提高,计算机被用于解决越来越复杂的问题,而面向过程那种通过一步一步实现功能来完成程序的方式将不断增加编程的难度,开发人员可能每次都要重新定义重复使用的方法,非常麻烦,如果将这些常用的方法,定义到类当中,每当需要该类的某些方法时,只要创建该类对应的对象,然后调用对象的方法即可;或者说将现实世界的事物抽象成对象,现实世界中的关系转化为继承,帮助人们实现对现实世界的抽象与数字建模,可以大幅度提高开发效率。通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析、设计与编程。
三、面向对象举例
下面我们举几个例子来帮助大家更好的理解面相对象:
例一:买电脑
方式一:
1. 上网查询各种电脑的配置信息,例如CPU型号,内存大小,硬盘容量大小,显卡型号等等。
2. 锁定目标以后,搜索网友对该款产品的评价,如果满足自己的需求,就买,否则,更换目标。
3. 确定目标以后,来到电脑城,找到该款电脑品牌专卖店,并与销售进行交涉。
4. 与销售进行砍价,直到双方达成协议,并进行交易,一手交钱一手交货。
方式二:
1. 找到懂电脑硬件的朋友。
2. 在这位朋友的带领下来到电脑城,由他负责选择电脑型号,同时也由他负责交涉。
3. 双方谈妥以后,你负责交款即可。
对比上下两种方式,方法一更接近面向过程,方法二更接近面向对象。
在方式一中:首先,由于自己不懂电脑硬件,仅仅在网上搜索资料,在短时间内是无法掌握选择适合自己电脑的能力的;其次,所有的事情都要由自己来完成,比较疲惫;最终,由于不懂硬件,容易被奸商欺骗。可以说,方式一就是一个一个的函数,依次执行的过程,它强调的是动作本身。
对比方式二:由于自己不懂电脑硬件,就寻找了解电脑硬件以及购买技巧的朋友(对象),并通过调用他的选择型号和交涉的功能来完成购买电脑的目的,最终你只要负责付钱就可以。
方式二强调的是懂电脑的朋友这个对象,由你面向这个对象,并通过他的种种方法实现买电脑的目的。很明显。这种方法更为简洁方便,复用性强,代码构建与书写更为高效。
例二:项目开发
方式一:
1. 公司接到项目。
2. 需求分析、设计、代码体现、测试等,都由老板自己干。
3. 五年以后,开发成功,委托单位可能不存在了。
方式二:
1. 公司接到项目。
2. 老板雇佣很多懂得软件开发的工程师帮助完成开发。
3. 从需求分析、设计、代码体现,到最终的测试环节,分工明确,责任到位。
4. 委托单位对结果比较满意,公司信誉提升。
很明显,方式一是面向过程,同样,解决问题的方式就是通过一步一步的执行“过程”来完成,在这里我们其实是执行者,需要亲自负责解决所有的问题。
方式二可以说是面向对象,老板面向不同的员工,也就是面向不同的对象,通过“调用”他们不同的功能,来完成任务。那么,相对于面向过程,我们就是指挥者。
有了上述两个例子,我们试着直接用面向对象的思想来思考下面这个例子。
例三:去饭店吃饭
1. 来到饭店。
2. 找到服务员,“调用”服务员点菜的功能。
3. 点完菜,通过服务员作为媒介,又去调用厨师炒菜的功能。在这里,我们不关心,做菜的过程,只需要炒好菜的结果。
4. 调用服务员传菜的功能,将菜端上来。
5. 吃饭。
四、 面向对象总结
1、 面向对象是一种思想,是思考问题的一种方式。
2、 相对于面向过程,面向对象将复杂的事物简单化了,面向过程需要将很多方法按顺序依次执行;而面向对象,首先需要这些功能所属的对象,然后调用该对象相应的功能,但在具体执行这些功能时还是要用到面向过程的思想。
3、 角色转变:执行者à指挥者。如何理解这句话呢?比如,开门这个动作,“打开”的原理只有门自己清楚,我们作为人是不清楚其中的原理的,因此就要将打开这个动作或者功能定义在门这一类事物中。因此,打开门,其实是我们作为人去指挥门,通过调用门的打开功能,来完成开门的目的。另外,还要指出的是,在将方法封装进类之前,我们首先要分析这些功能的共性,并且确定这些功能所述的类,然后才能进行类的定义。
小知识点1:
如何回答,对“面向对象”的理解?
第一步:叙述面向对象的定义。
广义上讲,面向对象是解决问题的思想;狭义上说,面相对象是一种编程思想。
第二步:表述面向对象的特点
1. 面向对象是一种解决问题的思想。
2. 可以使复杂问题简单化。
3. 角色转变:执行者à指挥者。
第二步:可以举出类似于上述的实例,来加以说明(注意要符合实地场景)。
比如面试的时候,可以这么说:
1. 员工为企业工作,其实就是在使用面向对象的思想。
2. 公司就是指挥者,我们员工就是对象。
3. 公司通过调用员工(对象)的不同功能,并将这些功能进行不同的组合,来完成一个个项目。在这个过程总,公司实现盈利,员工实现自己的价值。
当然,本人除了软件开发功能,还有诸如与人沟通的能力、组织协调的能力等等,可以应对各种困难。
五、 面向对象具体的实现步骤
完成需求时:
1、 先要去找具有所需的功能的对象来用。
2、 如果该对象不存在,那么创建一个具有所需功能的对象。
3、 调用该对象的各个方法来实现功能。这样简化开发并提高了代码的复用性,我们自己可以使用这个对象,其他开发者也可以使用这个对象。
举例:公司招聘
1. 寻找具有相关开发经验技能的人才(寻找具有相关功能的对象)。
2. 如果找到,就雇佣这个人才,并使其帮助公司完成项目(找到对象,并调用相关方法)。
3. 如果没有找到,就在公司内部进行培养,同样可以完成项目(没有相关对象,就创建一个符合需求的对象,并将相关功能定义到对象内部)。
小知识点2:
当我们面对日常生活中的事物时,应该如何用面向对象的思想去思考呢?例如,人开车。此时,我们可以使用名词提炼法——也就是说,将一个事件当中的所有的名词提炼出来,并“封装”成对象来看待,并分析他们之间的关系。
以上述“人开车”为例,这句话中,共有两个名词。分别是“人”和“车”。可以将人和车分别理解为两个对象。然后,在这两个事物之间时通过一个动作——“开”,使两个事物之间产生了联系。这时就有了一个问题,我们应该将“开”这个动作(或者说这个功能)定义在哪个对象内呢?谁最清楚这个动作是如何发生的,就将这个动作定义到谁的内部。那么,汽车本身最“清楚”汽车内部的运作原理,因此应该将“开”这个动作定义在车的内部。这是一个非常直观并且易于理解的方法。下面是代码体现:
class Car
{
publicvoid startEngine()
{
System.out.println("启动引擎");
}
publicvoid foreward()
{
System.out.println("前进");
}
}
class Person{
public void drive(Car c)
{
c.startEngine();
c.foreward();
}
}
class Demo
{
public static void main(String[] args)
{
Personp = new Person();
p.drive(newCar());
}
}
上述代码的运行结果:
启动引擎
前进