内容简介:周末午后,我正在愉快的打着王者荣耀,五杀在即之际。女朋友拿着一本我看过的《面向对象编程》过来找我。我不想吃米饭,我想吃馒头。上次买的菜家里面还有,不需要去买菜。
周末午后,我正在愉快的打着王者荣耀,五杀在即之际。女朋友拿着一本我看过的《面向对象编程》过来找我。
什么是面向对象?是要面向我写代码吗?
不是啦,这个面向对象的对象不是你这个对象啦。
此时,我突然感受到了一股莫名的杀气。
什么?你还有其他对象吗?有我好看吗?有我瘦吗?不对。你不能有其他对象。
什么是面向对象?
面向对象,英文名字叫Object Oriented,是一种软件开发方法。是和面向过程相对应的。
我有点饿了,要不然你给我做点饭,我慢慢的详细给你讲吧。
我现在就想听你给我讲,咱们直接点外卖吧,别自己动手做饭了。
其实,对于吃饭这件事儿,就可以分为面向过程吃饭和面向对象吃饭。自己亲自下厨就是面向过程,点外卖就是面向对象。
在面向过程的吃饭中,我们想要填饱肚子,需要自己亲自下厨把这顿饭做出来,那么,我们就需要先想好吃什么、然后去买菜、洗菜、洗米、蒸饭、炒菜等等一系列的事情。
pubic void 做饭(){ 制定菜单(); 买菜(); 洗菜(); 洗米(); 蒸饭(); 炒菜(); } 复制代码
那么,你说和点外卖相比,自己做饭有哪些缺点啊?
那还用说,麻烦呗。
的确,面向过程编程也一样,由于想要完成做饭这件事,需要自己定义很多个方法。除此之外,还有很多遇到很多其他问题,比如:
我不想吃米饭,我想吃馒头。
上次买的菜家里面还有,不需要去买菜。
中午吃剩下的菜家里面还有,直接热一热就可以吃了。
这次去的一家超市提供洗菜服务,不需要我们自己洗菜了。
以上这些突发事件,在编程中就叫做需求变更或者新的需求,这种事情发生是必然会发生的。
那么,有新的需求了怎么办,上面这种自己动手做饭的场景,就只能重新拼凑咯。
对于 程序员 来说,就需要通读代码,找出可以复用的方法,然后重新调用,不能复用的就重新写一个。时间久了,方法就会越来越多,系统维护越来越复杂。
面向对象,其实就是我们通过点外卖的方式来“做饭”。我们知道我们需要一顿饭,我们只需要打开外卖软件,在里面选择我们需要的菜品然后下单就可以了。我们不关心饭店做饭的过程。想吃什么点什么,家里来人了就再下一个订单,不想吃米饭了,想吃馒头了,也可以给饭店打电话,让他们把米饭换成馒头。
外卖软件.点餐(红烧肉,糖醋鱼,可乐一瓶).送达时间(一小时后).备注(可乐加冰) 复制代码
所以,通过面向对象的方式“做饭”,就像上面的代码一样。
哦,我明白了,面向对象就是把本来可能需要自
己做的事情交给别人来做?对于我来说,外卖软
件就是个对象,我再面向他“做饭”,其实是他
帮我做的。
额、你说的也对,也不对。在这个场景中,确实 可以把外卖软件当做是「对象」。其实,在面向 对象编程中,抛弃了函数,想要实现一个功能不 再是通过函数的叠加调用实现的了。而是通过对 象。
对象就是对事物的一种抽象描述。现实世界中的事物,都可以用「数据」和「能力」来描述。
比如我要描述一个人,「数据」就是他的年龄、性别、身高体重,「能力」就是他能做什么工作,承担什么样的责任。
描述一个外卖软件,「数据」就是他包含的菜品,而「能力」就是他可以点菜。
什么是封装?
我们把「数据」和「能力」组合成一个对象的过程就叫做「封装」。
封装的结果就是可以有一个类,通过这个类我们可以获得一个对象。然后我们就可以通过给这个对象下命令,让他执行自己的「能力」。
除了把「数据」和「能力」封装成一个「对象」
更加方便使用以外,还有啥其他的特点么?
封装只是面向对象的第一步,目的是把现实世界的东西抽象成对象。面向对象真正有威力的地方是「继承」和「多态」。
举一个不是很恰当,但是女朋友比较容易理解的例子。
我们使用外卖软件点餐,当我们第二次去某一家店时,外卖软件会提示你上一次你在这家点了什么,你可以点击<再来一单>把上次的菜品直接加到购物车中,这就是「继承」。而在购物车中的物品你可以直接付款下单,也可以把增删和修改菜品。这就是「多态」。
什么是继承?
在面向对象编程中,当两个类具有相同的特征(属性)和行为(方法)时,可以将相同的部分抽取出来放到一个类中作为父类,其它两个类「继承」这个父类。继承后子类自动拥有了父类的部分属性和方法。
通过继承创建的新类称为“子类”或“派生类”。
被继承的类称为“基类”、“父类”或“超类”。
比如:
狗{ 吠(); } 牧羊犬 继承 狗{ 放羊(); } 复制代码
上面的例子中, 狗类
是父类, 牧羊犬类
是子类。牧羊犬类通过继承获得狗类的 吠()
的能力,同时增加了自己独有的 放羊()
的能力。转换成 Java 代码如下:
public class Dog{ public void bark(){ System.out.print("旺旺旺"); } } public class HerdingDog extends Dog{ public void herd(){ System.out.print("放羊中...."); } } public class Main(){ HerdingDog dog = new HerdingDog(); dog.bark(); dog.herd(); } 复制代码
什么是多态?
同一操作,作用于不同的对象,可以产生不同的结果,这就是「多态」。通常说的多态都是指运行期的多态,也叫动态绑定。
要实现多态,需要满足三个条件:
有类继承或接口实现、子类重写父类的方法、父类引用指向子类的对象。比如:
犬科动物{ 吠(); } 狗 继承 犬科动物{ 吠(){旺旺旺} } 狼 继承 犬科动物{ 吠(){嗷嗷嗷} } 复制代码
狗和狼都是犬科动物,拉来一直犬科动物,如果它你叫的话,你可能没办法直接分辨出他到底是狼还是狗。只要他真正的叫出来的时候,你才知道。这就是运行时多态。转化成Java代码如下:
public class Canidae{ public void bark(); } public class Dog extends Canidae{ public void bark(){ System.out.print("旺旺旺...."); } } public class Wolf extends Canidae{ public void bark(){ System.out.print("嗷嗷嗷...."); } } public class Main(){ Canidae canidae = new Dog(); canidae.bark(); Canidae canidae1 = new Wolf(); canidae1.bark(); } 复制代码
这样,就实现了多态,同样是Canidae的实例,canidae.bark调用的就是Dog类的方法,而canidae1.bark();调用的却是Wolf的方法。
有人说,你自己定义的对象,定义的时候不就知道canidae到底是什么类的对象了么,这个其实并不决定的,很多时候我们可能不知道,原因是,对象可能并不是我们自己new出来的,比如Spring的IOC。
奥,那我终于知道什么是面向对象编程了。
嗯,对了,外卖点好了么?
呃....
(全文完)
漫话编程
微信:mhcoding
让编程变得有乐趣
长按二维码关注
以上所述就是小编给大家介绍的《漫话:如何给女朋友解释什么是面向对象编程?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 漫话:如何给女朋友解释什么是熔断?
- 漫话:如何给女朋友解释什么是 Mock?
- 漫话:如何给女朋友解释什么是 RPC
- 漫话:如何给女朋友解释什么是负载均衡
- 漫话:如何给女朋友解释什么是 HTTP
- 漫话:如何给女朋友解释什么是反向代理?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Types and Programming Languages
Benjamin C. Pierce / The MIT Press / 2002-2-1 / USD 95.00
A type system is a syntactic method for automatically checking the absence of certain erroneous behaviors by classifying program phrases according to the kinds of values they compute. The study of typ......一起来看看 《Types and Programming Languages》 这本书的介绍吧!