什么是面向过程,什么是面向对象

本文转自:http://www.sohu.com/a/245540002_100180425

如何给女朋友解释什么是面向对象编程?

周末午后,我正在愉快的打着王者荣耀,五杀在即之际。女朋友拿着一本我看过的《面向对象编程》过来找我。

  • 女朋友:什么是面向对象?是要面向我写代码吗?
  • 我: 不是啦,这个面向对象的对象不是你这个对象啦。
  • 此时,我突然感受到了一股莫名的杀气。
  • 我:什么?你还有其他对象吗?有我好看吗?有我瘦吗?不对。你不能有其他对象。

什么是面向对象?

面向对象,英文名字叫Object Oriented,是一种软件开发方法。是和面向过程相对应的。

女朋友:别给我拽英文。给我详细说说,说不明白今天就没完。

  • 我:我有点饿了,要不然你给我做点饭,我慢慢的详细给你讲吧。
  • 女朋友:我现在就想听你给我讲,咱们直接点外卖吧,别自己动手做饭了。

其实,对于吃饭这件事儿,就可以分为面向过程吃饭和面向对象吃饭。自己亲自下厨就是面向过程,点外卖就是面向对象。

在面向过程的吃饭中,我们想要填饱肚子,需要自己亲自下厨把这顿饭做出来,那么,我们就需要先想好吃什么、然后去买菜、洗菜、洗米、蒸饭、炒菜等等一系列的事情。

  • 我:那么,你说和点外卖相比,自己做饭有哪些缺点啊?
  • 女朋友:那还用说,麻烦呗。

的确,面向过程编程也一样,由于想要完成做饭这件事,需要自己定义很多个方法。除此之外,还有很多遇到很多其他问题,比如:

  • 我不想吃米饭,我想吃馒头。
  • 上次买的菜家里面还有,不需要去买菜。
  • 中午吃剩下的菜家里面还有,直接热一热就可以吃了。
  • 这次去的一家超市提供洗菜服务,不需要我们自己洗菜了。

以上这些突发事件,在编程中就叫做需求变更或者新的需求,这种事情发生是必然会发生的。

那么,有新的需求了怎么办?上面这种自己动手做饭的场景,就只能重新拼凑咯。

对于程序员来说,就需要通读代码,找出可以复用的方法,然后重新调用,不能复用的就重新写一个。时间久了,方法就会越来越多,系统维护越来越复杂。

面向对象,其实就是我们通过点外卖的方式来“做饭”。我们知道我们需要一顿饭,我们只需要打开外卖软件,在里面选择我们需要的菜品然后下单就可以了。我们不关心饭店做饭的过程。想吃什么点什么,家里来人了就再下一个订单,不想吃米饭了,想吃馒头了,也可以给饭店打电话,让他们把米饭换成馒头。

所以,通过面向对象的方式“做饭”,就像上面的代码一样。

  • 女朋友:哦,我明白了,面向对象就是把本来可能需要自己做的事情交给别人来做?对于我来说,外卖软件就是个对象,我再面向他“做饭”,其实是他帮我做的。
  • 我:额、你说的也对,也不对。在这个场景中,确实可以把外卖软件当做是「对象」。其实,在面向对象编程中,抛弃了函数,想要实现一个功能不再是通过函数的叠加调用实现的了。而是通过对象。

对象就是对事物的一种抽象描述。现实世界中的事物,都可以用「数据」和「能力」来描述。

比如我要描述一个人,「数据」就是他的年龄、性别、身高体重,「能力」就是他能做什么工作,承担什么样的责任。

描述一个外卖软件,「数据」就是他包含的菜品,而「能力」就是他可以点菜。

什么是封装?

我们把「数据」和「能力」组合成一个对象的过程就叫做「封装」。

封装的结果就是可以有一个类,通过这个类我们可以获得一个对象。然后我们就可以通过给这个对象下命令,让他执行自己的「能力」。

  • 女朋友:除了把「数据」和「能力」封装成一个「对象」更加方便使用以外,还有啥其他的特点么?

封装只是面向对象的第一步,目的是把现实世界的东西抽象成对象。面向对象真正有威力的地方是「继承」和「多态」。

举一个不是很恰当,但是女朋友比较容易理解的例子。

我们使用外卖软件点餐,当我们第二次去某一家店时,外卖软件会提示你上一次你在这家点了什么,你可以点击<再来一单>把上次的菜品直接加到购物车中,这就是「继承」。而在购物车中的物品你可以直接付款下单,也可以把增删和修改菜品。这就是「多态」。

什么是继承?

在面向对象编程中,当两个类具有相同的特征(属性)和行为(方法)时,可以将相同的部分抽取出来放到一个类中作为父类,其它两个类「继承」这个父类。继承后子类自动拥有了父类的部分属性和方法。

通过继承创建的新类称为“子类”或“派生类”。

被继承的类称为“基类”、“父类”或“超类”。

比如:

上面的例子中,狗类 是父类,牧羊犬类 是子类。牧羊犬类 通过继承获得狗类的 吠() 的能力,同时增加了自己独有的 放羊() 的能力。转换成Java代码如下:

什么是多态?

同一操作,作用于不同的对象,可以产生不同的结果,这就是「多态」。通常说的多态都是指运行期的多态,也叫动态绑定。

要实现多态,需要满足三个条件:

有类继承或接口实现、子类重写父类的方法、父类引用指向子类的对象。比如:

狗和狼都是犬科动物,拉来一直犬科动物,如果它你叫的话,你可能没办法直接分辨出他到底是狼还是狗。只要他真正的叫出来的时候,你才知道。这就是运行时多态。转化成Java代码如下:

这样,就实现了多态,同样是Canidae的实例,canidae.bark调用的就是Dog类的方法,而canidae1.bark();调用的却是Wolf的方法。

有人说,你自己定义的对象,定义的时候不就知道canidae到底是什么类的对象了么,这个其实并不决定的,很多时候我们可能不知道,原因是,对象可能并不是我们自己new出来的,比如Spring的IOC。

  • 女朋友:奥,那我终于知道什么是面向对象编程了。
  • 我:嗯,对了,外卖点好了么?
  • 女朋友:呃....
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349