漫话:如何给女朋友解释什么是面向对象编程?
周末午后,我正在愉快的打着王者荣耀,五杀在即之际。女朋友拿着一本我看过的《面向对象编程》过来找我。
什么是面向对象?是要面向我写代码吗?
不是啦,这个面向对象的对象不是你这个对象啦。
此时,我突然感受到了一股莫名的杀气。
什么?你还有其他对象吗?有我好看吗?有我瘦吗?不对。你不能有其他对象。
什么是面向对象?
面向对象,英文名字叫Object Oriented,是一种软件开发方法。是和面向过程相对应的。
别给我拽英文。给我详细说说,说不明白今天就没完。
我有点饿了,要不然你给我做点饭,我慢慢的详细给你讲吧。
我现在就想听你给我讲,咱们直接点外卖吧,别自己动手做饭了。
其实,对于吃饭这件事儿,就可以分为面向过程吃饭和面向对象吃饭。自己亲自下厨就是面向过程,点外卖就是面向对象。
在面向过程的吃饭中,我们想要填饱肚子,需要自己亲自下厨把这顿饭做出来,那么,我们就需要先想好吃什么、然后去买菜、洗菜、洗米、蒸饭、炒菜等等一系列的事情。
pubicvoid做饭(){
制定菜单();
买菜();
洗菜();
洗米();
蒸饭();
炒菜();
}
那么,你说和点外卖相比,自己做饭有哪些缺点啊?
那还用说,麻烦呗。
的确,面向过程编程也一样,由于想要完成做饭这件事,需要自己定义很多个方法。除此之外,还有很多遇到很多其他问题,比如:
我不想吃米饭,我想吃馒头。
上次买的菜家里面还有,不需要去买菜。
中午吃剩下的菜家里面还有,直接热一热就可以吃了。
这次去的一家超市提供洗菜服务,不需要我们自己洗菜了。
以上这些突发事件,在编程中就叫做需求变更或者新的需求,这种事情发生是必然会发生的。
那么,有新的需求了怎么办,上面这种自己动手做饭的场景,就只能重新拼凑咯。
对于程序员来说,就需要通读代码,找出可以复用的方法,然后重新调用,不能复用的就重新写一个。时间久了,方法就会越来越多,系统维护越来越复杂。
面向对象,其实就是我们通过点外卖的方式来“做饭”。我们知道我们需要一顿饭,我们只需要打开外卖软件,在里面选择我们需要的菜品然后下单就可以了。我们不关心饭店做饭的过程。想吃什么点什么,家里来人了就再下一个订单,不想吃米饭了,想吃馒头了,也可以给饭店打电话,让他们把米饭换成馒头。
外卖软件.点餐(红烧肉,糖醋鱼,可乐一瓶).送达时间(一小时后).备注(可乐加冰)
所以,通过面向对象的方式“做饭”,就像上面的代码一样。
哦,我明白了,面向对象就是把本来可能需要自己做的事情交给别人来做?对于我来说,外卖软件就是个对象,我再面向他“做饭”,其实是他帮我做的。
额、你说的也对,也不对。在这个场景中,确实可以把外卖软件当做是「对象」。其实,在面向对象编程中,抛弃了函数,想要实现一个功能不再是通过函数的叠加调用实现的了。而是通过对象。
对象就是对事物的一种抽象描述。现实世界中的事物,都可以用「数据」和「能力」来描述。
比如我要描述一个人,「数据」就是他的年龄、性别、身高体重,「能力」就是他能做什么工作,承担什么样的责任。
描述一个外卖软件,「数据」就是他包含的菜品,而「能力」就是他可以点菜。
什么是封装?
我们把「数据」和「能力」组合成一个对象的过程就叫做「封装」。
封装的结果就是可以有一个类,通过这个类我们可以获得一个对象。然后我们就可以通过给这个对象下命令,让他执行自己的「能力」。
除了把「数据」和「能力」封装成一个「对象」更加方便使用以外,还有啥其他的特点么?
封装只是面向对象的第一步,目的是把现实世界的东西抽象成对象。面向对象真正有威力的地方是「继承」和「多态」。
举一个不是很恰当,但是女朋友比较容易理解的例子。
我们使用外卖软件点餐,当我们第二次去某一家店时,外卖软件会提示你上一次你在这家点了什么,你可以点击<再来一单>把上次的菜品直接加到购物车中,这就是「继承」。而在购物车中的物品你可以直接付款下单,也可以把增删和修改菜品。这就是「多态」。
什么是继承?
在面向对象编程中,当两个类具有相同的特征(属性)和行为(方法)时,可以将相同的部分抽取出来放到一个类中作为父类,其它两个类「继承」这个父类。继承后子类自动拥有了父类的部分属性和方法。
通过继承创建的新类称为“子类”或“派生类”。
被继承的类称为“基类”、“父类”或“超类”。
比如:
狗{
吠();
}
牧羊犬 继承 狗{
放羊();
}
上面的例子中,狗类是父类,牧羊犬类是子类。牧羊犬类通过继承获得狗类的吠()的能力,同时增加了自己独有的放羊()的能力。转换成Java代码如下:
publicclassDog{
publicvoidbark(){
System.out.print("旺旺旺");
}
}
publicclassHerdingDogextendsDog{
publicvoidherd(){
System.out.print("放羊中....");
}
}
publicclassMain(){
HerdingDog dog =newHerdingDog();
dog.bark();
dog.herd();
}
什么是多态?
同一操作,作用于不同的对象,可以产生不同的结果,这就是「多态」。通常说的多态都是指运行期的多态,也叫动态绑定。
要实现多态,需要满足三个条件:
有类继承或接口实现、子类重写父类的方法、父类引用指向子类的对象。比如:
犬科动物{
吠();
}
狗 继承 犬科动物{
吠(){旺旺旺}
}
狼 继承 犬科动物{
吠(){嗷嗷嗷}
}
狗和狼都是犬科动物,拉来一直犬科动物,如果它你叫的话,你可能没办法直接分辨出他到底是狼还是狗。只要他真正的叫出来的时候,你才知道。这就是运行时多态。转化成Java代码如下:
publicclassCanidae{
publicvoidbark();
}
publicclassDogextendsCanidae{
publicvoidbark(){
System.out.print("旺旺旺....");
}
}
publicclassWolfextendsCanidae{
publicvoidbark(){
System.out.print("嗷嗷嗷....");
}
}
publicclassMain(){
Canidae canidae =newDog();
canidae.bark();
Canidae canidae1 =newWolf();
canidae1.bark();
}
这样,就实现了多态,同样是Canidae的实例,canidae.bark调用的就是Dog类的方法,而canidae1.bark();调用的却是Wolf的方法。
有人说,你自己定义的对象,定义的时候不就知道canidae到底是什么类的对象了么,这个其实并不决定的,很多时候我们可能不知道,原因是,对象可能并不是我们自己new出来的,比如Spring的IOC。
奥,那我终于知道什么是面向对象编程了。
嗯,对了,外卖点好了么?
呃....
(全文完)
欢迎工作一到五年的Java工程师朋友们加入Java架构开发:860113481
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
蚂蚁金服的一次面试经历(一面、二面)
一次有把握的面试,需要经过长时间的准备 电话一面 1、自我介绍、自己做的项目和技术领域 2、项目中的监控:那个监控指标常见的有哪些? 3、微服务涉及到的技术以及需要注意的问题有哪些? 4、注册中心你了解了哪些? 5、consul 的可靠性你了解吗? 6、consul 的机制你有没有具体深入过?有没有和其他的注册中心对比过? 7、项目用 Spring 比较多,有没有了解 Spring 的原理?AOP 和 IOC 的原理 8、Spring Boot除了自动配置,相比传统的 Spring 有什么其他的区别? 9、Spring Cloud 有了解多少? 10、Spring Bean 的生命周期 11、HashMap 和 hashTable 区别? 12、Object 的 hashcode 方法重写了,equals 方法要不要改? 13、Hashmap 线程不安全的出现场景 14、线上服务 CPU 很高该怎么做?有哪些措施可以找到问题 15、JDK 中有哪几个线程池?顺带把线程池讲了个遍 16、SQL 优化的常见方法有哪些 17、SQL 索引的顺序,字段的顺序 18、查看 SQL 是不是使用了索...
- 下一篇
基于Chrome内核(WebKit.net)定制开发DoNet浏览器
原文: 基于Chrome内核(WebKit.net)定制开发DoNet浏览器 1. 源起 a) 定制.Net浏览器 本人是一名C#开发者,而作为C#开发者,做客户端应用中最头痛的一件事就是没有一个好的UI解决方案, WinFrom嘛,效率虽然还不错,但是做一些特殊的效果,完全应付不来,比如透明控件。比FPS太低有时候界面闪动得厉害。而WPF呢,内用内存又太高,效率有时候跟不上,而且还可能会出现内存泄露!出于以上的原因,博主一直在寻找一个好的UI解决方案,最终选定CEF。(至于CEF是什么我就不解释了,可以百度!),在C#中CEF的一个开源项目,名称叫做CEFGLUE。 b) 加快葬送IE6浏览器的进程 世界上使用IE6浏览器最多的地方在中国,中国使用IE6浏览器最多的地方在企业中,让他们自己去装个chorme太难了,索性开发个浏览器(其实是浏览器的外壳,并且我们可以做的一个十分绚丽便捷的外壳)给他们,一劳永逸的解决浏览器兼容问题,各种浏览器的CSS hack问题再也不用担心了,甚至公司里前端的职位也可以减少几个了。 c) 更方便的使用更强大的HTML5 写HTML5的样式,需要考虑各种...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7安装Docker,走上虚拟化容器引擎之路