趣味故事掌握面向对象编程,巨头家族发家之内幕解读!
小白最近看了很多讲面向对象的资料,就是记不住。
结果他奶奶很着急,过来让我帮忙。
你说怎么小白150斤了还要人心疼!奶奶说不会吧,难道这个问题把我这个十年老兵难住了?然后又是夸了一顿!
哎,碍于情面,我就给奶奶讲吧,让她回去再告诉小白。
大伙都知道面向对象有三大特点:封装,多态,继承。
雷学委将从一个巨头家族如何挣钱发家来深度剖析面向对象的三个特性。
怎么理解多态?
开始巨头的故事:以前有一个商业巨头:大大大企业家王总,他有一儿一女,然后他宣布把集团划分为两个部分。给两个人分开管理。
并提出一个要求:赚钱盈利。
儿子把子业务群进行调整打包整合了一个游戏生态,日赚不止208W,这也是一个巨头。
女儿把子业务群进行调整打包整合了一个电商生态,日赚也不止208W,这么猛又一个巨头啊!
王总看了直呼惊艳!
好这里,回到主题,里面说的什么契合多态呢?
赚钱盈利 这个指标就是父类的一个方法!
儿子女儿虽然都有各自的实现方法赚钱方式,但是都达到符合了赚钱的目标。
这就是多态!
忘记提了,王总原来是做房地产发家的,所以他自己实现的赚钱盈利方法:房地产销售和服务等
多态的概念:多个不同的对象对同一消息作出响应。同一消息根据不同的对象而采用各种不同的方法。
换句话说,不论传递过来的究竟是哪个类的对象,函数都能够通过同一个标准(接口)调用到适应各自对象的实现方法。
还不明白就,看下图,金黄色椭圆就是一个接口,内声明了赚钱这个方法。王总,儿子,女儿都有各自实现。这就是多态,各个实现的类都有自己的赚钱方式!
既统一保证他们都有赚钱方式,又没有扼杀他们的才华,在各自赛道挣钱。
这里稍微看一下代码,我们先定一个接口:EarnMondey(挣钱不寒颤)。
/**
* @author levin
* Created on 2021/6/17
* [B站 雷学委] CSDN/Juejin Code Demo
*/
public interface EarnMoney {
// 实现类必须实现盈利赚钱的方法
Long earnW();
}
下面看看多态的实现:
// 雷学委 CSDN/Juejin代码分享
// 这是老王一家子(王总+儿子01+女儿02)
public class WangZong implements EarnMoney {
/**
* 存款
* @return
*/
public String saving() {
return "¥3000亿";
}
public String earnW() {
return "搞房地产挣钱!!!";
}
}
class XiaoWang01 extends WangZong {
@Override
public String earnW() {
return "搞游戏特挣钱!!!";
}
}
class XiaoWang02 extends WangZong {
@Override
public String earnW() {
return "搞电商生态也特挣钱!!!";
}
}
是不是跟上面说的一样?
类WangZong/XiaoWang01/XiaoWang02 都对EarnMoney有各自不同实现!(这里的’类‘,表示一类事物的统称。比如车‘类’代表车辆特征这一类事物,有轮子能开启来。
多态就是如此。接口规定了一个标准的方法(就是赚钱),父亲已经有一个成熟的经商赚钱的方法,不过他的子女重新实现了各自赚钱方法。
好我们,打印一下他们赚钱的方法,返回效果如下。
下面来看看继承。
什么是继承?
你看,王总商业帝国那么大,这么大规模的资产。假设他的全部资产变现,估算的总额为3000亿元。
没有继承制度,那干一辈子不都打水漂了嘛!
所以现实中,他的两个子女都是能合法享有老王创造的财产,资源,人脉等,累计3000亿。
这就是继承。
继承的概念:从已知类派生出一个或多个新的子类。父类所有非私有化的属性和方法,子类都继承,也可以扩展重写父类方法(非final声明的)。
前面代码所示:XiaoWang01 和XiaoWang02都继承(extend)了老王WangZong。
细心的同学应该有留意到上面代码WangZong这类代码里面还贴了一个saving方法,对,这个就是他的全部资产合计面额值。子女类中不用再实现这个,复用了代码。
简化如下图:王总有一个存款的方法,子女都继承了。
好,我们看看代码演示效果:
到这里,学委有必要展示一下上效果图的代码了。
/**
* @author levin
* Created on 2021/6/17
* [雷学委] CSDN/Juejin Code Demo
*/
public class LeiXueWeiRunner {
public static void main(String[] args) {
System.out.println("【雷学委代码Demo】");
EarnMoney wz = new WangZong();
EarnMoney wzSon = new XiaoWang01();
EarnMoney wzDaughter = new XiaoWang02();
System.out.println("王总的生财之道:" + wz.earnW());
System.out.println("王总儿子的生财之道:" + wzSon.earnW());
System.out.println("王总女儿的生财之道:" + wzDaughter.earnW());
System.out.println("------------demo 一下继承 ------------");
System.out.println("王总资产:" + ((WangZong) wz).saving());
System.out.println("儿子继承的资产:" + ((WangZong) wzSon).saving());
System.out.println("女儿继承资产:" + ((WangZong) wzDaughter).saving());
}
}
重点代码解析
‘System.out.println("------------demo 一下继承 ------------");’这行代码之后的三行代码,需要把wz/wzSon/wzDaughter 进行类型转换成王总,那是肯定的。
小白奶奶稍微有点疑惑了。
因为saving这个方法只在王总那里定义了,调用时必须保证是亲生血缘关系,不是亲生的这里Java会爆出类型转换的错误!
奶奶一下子明白了,对这巨额资产不能白送了,必须保证直系亲属!
下面再谈谈封装。
怎么理解封装?
封装,就是把实现通过包装变成统一的对外呈现,模块化来使用,重点是隐藏了实现细节,其他外部访问无法攥改内部细节。
好结合上面的例子,请读者细想30秒,想想哪些事情很像封装?
好,这里揭晓了。
上面的saving方法就是一种封装。
封装的概念:把对象的内部细节(属性和方法)结合成一个独立的整体,隐藏实现细节,并提供对外访问的接口。
不过我这里想举例的是,另一个,那就是王总立遗嘱,他人只能知道遗嘱声明,但是无法攥改遗嘱细节,也不清楚这个遗嘱怎么写的,跟哪些人商议决定的。
好家伙,封装还有这个用途。这里用遗嘱也是想更鲜明的突出:隐藏细节,不可攥改的特点。
如下图, 封装 把内部属性和处理逻辑给隐藏起来了,而且外部无法攥改!
这是最终王总这个类的代码,我们在代码中加上了遗嘱”testament“这个公开的方法,其他类包括资料能看到,但是无法修改!律师只执行王总遗嘱无法修改。
/**
* @author levin
* Created on 2021/6/17
* [雷学委] CSDN/Juejin Code Demo
*/
public class WangZong implements EarnMoney {
public String saving() {
return "¥3000亿";
}
public String earnW() {
return "搞房地产挣钱!!!";
}
/**
* 老王这里立下遗嘱,还是final的。
* @return
*/
public final String testament(){
//这个属于王总自己决定的,方法内部其他外部对象无法攥改了。
return "我有多少"+saving()+"分给儿子1500亿,分给女儿1500亿。";
}
}
所以说吧,封装的东西不是硬撩就能打开的!王总他儿子也不行,这是程序的规范!
除非王总自己说出来,那相当于把封装细节暴露到外部了。他也不傻的,万一所有信息都公开(public),随便改,改到最后遗嘱都不知道是转让给邻居家的小表弟的狗子了,多冤啊。
不过,明确的说,代码中,封装过的方法是没有办法被外部攥改的。
奶奶突然问:如果老王这整类代码都被掉包了呢,比如换人高仿假扮老王宣布假遗嘱?
雷学委微微一笑,那是另一个故事了。都掉包还咋整呢。
总结
本文重点讲了面向对象的3个特征:
- 多态:一个标准不同实现,这利于扩展
- 继承:父子间派生传递,复用代码
- 封装:隐藏内部实现细节,提高安全性和简化调用
至此,你看明白了这三个概念了吗?
多写代码多看图,搞技术得把握住关键,理解要点,不然就是事倍功半!
虽然采用Java实现,但核心原理其他语言都适用,刷几百万都买不来这么值的!
对于什么this和super这些没有涉及,以后可以再谈。
持续学习持续开发,我是雷学委!
编程很有趣,关键是把技术搞透彻讲明白。
欢迎关注,还有尽情点赞收藏!
觉得很好就多转发分享给更多人呗,学委忙着写文章也不清楚还有多少个小白的奶奶还在操心呢!
爱好很广泛,后面会再出多点Java方面的, 喜欢NodeJS的也可以关注我的雷学委的NodeJS系列
- 点赞
- 收藏
- 关注作者
评论(0)