面向对象编程<一>:大象入冰箱
一、前言
这两天系统学完了Java面向对象编程的知识内容,觉得有必要记录一下,不只是为了分享更是为了自己巩固,废话不多说,面向对象内容将分为4个环节来写:
一、面向对象的思想(也就是本文);
二、类及对象;
三、Java面向对象的三大特征:封装性,继承性与多态性;
四、Java中的关键字,比如interface,abstract,static等等。
后续完成后也会把链接贴到这里的!!
二、面向过程与面向对象
2.1、面向过程(POP)
面向过程强调的是功能行为,以函数为最小单位。考虑怎么做,如何做,是按照解决问题的一个个步骤去编程。
在这里举一个比较简单的例子,方便大家理解。日常做家务的时候,大家肯定会按照自己习惯的顺序,我们假定做家务包含四个内容:扫地,擦地,擦桌子和擦玻璃。第一个人喜欢先擦桌子,扫地,擦地,擦玻璃这样的顺序,而第二个人就习惯先擦玻璃,再扫地,擦地,擦桌子。那么在面向过程的编程思想中,就要按照不同人的不同顺序去编写程序,对于第一个人来说就是要1.擦桌子 2.扫地 3.擦地 4.擦玻璃 ; 对于第二个人就是1.擦玻璃 2.扫地 3.擦地 4.擦桌子 。人不同,编程的顺序就要改(啊啊,这不是重点),重点是擦玻璃是一个方法,扫地是一个方法,擦地是一个方法,擦桌子是一个方法。四个方法合起来就是做家务这一整件事,只要按照不同人的顺序来编程即可完成面向过程的程序。
2.2、面向对象(OOP)
面向对象将功能封装进对象,强调了具备了功能的对象,以类/对象为最小单位,考虑谁来做,更关注对象的功能,是对象具有解决全部问题或是部分问题的功能,去让对象解决问题。面向对象更强调运用人类在日常的思维逻辑中采用的思想方法与原则。
还是之前的例子,人做家务,那么此时,就不能按照之前面向过程的思想来写了(这不是废话吗,,)。这里我们需要将事情分为多个类(就是多个物种),在这里就有人(干活的),物品(桌子,玻璃,地),工具(供人干活的)这三种类。在人这个类里可能就要涵盖干活的是谁,用什么工具干活的等等;在物品这个类里面就要包含需要处理的物品;在工具类中就包含用的什么工具等。由此将整个做家务的事情分为多个类共同去完成,不再是遵循一条时间线,一步一步不分彼此地去完成。
2.3、面向过程VS面向对象?
POP与OOP都是一种编程思想,面向对象是相对于面向过程而言的。这里引用一个我见过的比较通俗的例子给大家整体的体会一下两者的异同。
用面向过程的方法写出来的程序是一份蛋炒饭,而用面向对象写出来的程序是一份盖浇饭。所谓盖浇饭,北京叫盖饭,东北叫烩饭,广东叫碟头饭,就是在一碗白米饭上面浇上一份盖菜,你喜欢什么菜,你就浇上什么菜。我觉得这个比喻还是比较贴切的。
蛋炒饭制作的细节,我不太清楚,因为我没当过厨师,也不会做饭,但最后的一道工序肯定是把米饭和鸡蛋混在一起炒匀。盖浇饭呢,则是把米饭和盖菜分别做好,你如果要一份红烧肉盖饭呢,就给你浇一份红烧肉;如果要一份青椒土豆盖浇饭,就给浇一份青椒土豆丝。
蛋炒饭的好处就是入味均匀,吃起来香。如果恰巧你不爱吃鸡蛋,只爱吃青菜的话,那么唯一的办法就是全部倒掉,重新做一份青菜炒饭了。盖浇饭就没这么多麻烦,你只需要把上面的盖菜拨掉,更换一份盖菜就可以了。盖浇饭的缺点是入味不均,可能没有蛋炒饭那么香。
到底是蛋炒饭好还是盖浇饭好呢?其实这类问题都很难回答,非要比个上下高低的话,就必须设定一个场景,否则只能说是各有所长。如果大家都不是美食家,没那么多讲究,那么从饭馆角度来讲的话,做盖浇饭显然比蛋炒饭更有优势,他可以组合出来任意多的组合,而且不会浪费。
盖浇饭的好处就是”菜”“饭”分离,从而提高了制作盖浇饭的灵活性。饭不满意就换饭,菜不满意换菜。用软件工程的专业术语就是”可维护性“比较好,”饭” 和”菜”的耦合度比较低。蛋炒饭将”蛋”“饭”搅和在一起,想换”蛋”“饭”中任何一种都很困难,耦合度很高,以至于”可维护性”比较差。软件工程追求的目标之一就是可维护性,可维护性主要表现在3个方面:可理解性、可测试性和可修改性。面向对象的好处之一就是显著的改善了软件系统的可维护性。
2.4、把大象装进冰箱需要几步?
一说到把大象装进冰箱,就勾起了博主满满的回忆,当时觉得傻傻的问题,冰箱怎么装的下大象,现在也已经算是家喻户晓的问题了。需要3步:把冰箱门打开,把大象装进冰箱,关上冰箱门。这就是一个很简单的面向过程思想的体现,将步骤写成函数,一步一步去完成。而面向对象过程,就需要将程序分为3个类来写,大象,冰箱,人。具体的伪代码如下。
人{
打开(冰箱){
冰箱.开门();
}
操作(大象){
大象.进入(冰箱);
}
关闭(冰箱){
冰箱.关门();
}
}
冰箱{
开门(){}
关门(){}
}
大象{
进入(冰箱);
}