专栏首页码思客想要成为VIP等级玩家吗 先来学学继承

想要成为VIP等级玩家吗 先来学学继承

java零基础入门-面向对象篇(八) 继承 与 封装

每次看到继承就勾起了我当年学习这块知识的时候,那痛苦不堪的回忆。

当年学继承的时候 到处都是 A啊B啊继承啊,不仅看的头皮发麻,还容易被绕晕,你们写教材的大佬举个轻松愉快的例子会怀孕吗?啊啊啊???

再就是,动不动就是儿子老子,孙子爷爷,你继承你爹的,你爹继承你爷爷,你家关系是有多复杂,搞来搞去好像就你活着就是为了你爹那点私房钱,真是不忍直视。

为了好好解释继承这个东西,我专门研究了一下某大厂的VIP系统(小编如此用心良苦,你们忍心不点赞么),此系统可是鼎鼎大名的,我们从系统功能设计的角度来看看继承。

什么是继承 ?为什么要继承 ?

java里面继承关系的关键字是extends,而这个单词却跟继承八竿子打不着关系,其实我们通常说的继承应该描述为 扩展 才更加准确。

关键字

在我们为一个系统写功能的时候,会遇到这种情况,新建了一个类,用着用着发现又要新建一个类,而这个类只与前面那个类有些许不同,大部分是相同的,而我们不得不去将属性啊,方法啊重新再写一遍。我们前面说了,写代码千万不要复制粘贴,我们学习的方法是在类的内部,将逻辑重用的一种方法,而继承,则是将类重用的一种方法。

比如下面我们要说的VIP系统,VIP有3个等级,VIP1,VIP2,VIP3,普通玩家是player,VIPLevelOne 是VIP1级用户,他们有相同的基础属性和方法,但是如果我们不使用继承,会是这样。

重复的代码

作为一个程序员,我们必须有基本的修养,眼里不能容下任何一粒沙子,相同的代码就是沙子。如果使用继承,我们完全可以重用代码,VIP用户也是用户,他可以通过继承获得用户player的全部属性和方法。

继承直接获取属性和方法

除了代码的重用,继承更常用的一个用法就是扩展类。为什么要扩展?我们看下下面这个场景。

有时候,你加入一家心仪已久的公司,上头交代一个任务,准备就绪,开始撸代码,突然发现,你需要使用一个方法,然后这个方法的最上面有一行注释,写着 “作者 XXX 20XX年 创建”, XXX就是你的老板,这时候咋办,你去改你老板写的代码?先不说能不能改,这个系统已经跑了很久了,你把它改了,万一出了问题,那不是开除走人就能解决的了,万一造成大面积的系统崩溃,可是要赔钱的,你真的想删库跑路么?。。。

就算能改,你是瞧不起你老板么?他老人家的代码你也要改?你以为你是谁?

改嘛~不敢~ 不改嘛~任务完成不了怎么交差啊,这时候,继承的特性就派上用场了。

我们完全可以不去改这个类,而是用另一个类来继承他,当我们继承一个类的时候,除了获得这个类的全部属性,方法和构造器的使用权,还可以自己写同名属性,同名方法,这样我们就可以在不改变原来老板写的代码的情况下,来 “修改” 这个类了。关于这个特性我们后面章节详细说。

vip 系统介绍

写代码之前,先要弄清楚 需求 ,需求设计可是需要在写代码之前完成的。

玩过游戏的同学都知道,有个大厂的游戏,充钱越多,越牛X。如何牛X?

确认下眼神

确认过眼神~~是充过钱的人~~我把你举报~而却封我的号~~

这就是VIP的气势,自带气场光环,不服不行啊。

我们看看你要充多少钱才能成为VIP。

VIP充值金额

每个等级的VIP可以获得的服务是不同的,等级越高获得的服务越牛,简直就是给你开了官方版外挂。外挂太多,我们挑几个看看。

VIP专属权限

我们看了系统需求,来看看我们如何把他抽象成类,如何设计这个VIP体系。

vip的继承设计

首先最基础的是玩家,就是Player类,然后我们的VIP1直接继承Player,VIP2拥有全部的VIP1特权,并且有自己新的特权,VIP2继承VIP1。同理,VIP3继承VIP2。这样,我们就可以使用继承特性完成三个类的创建。

VIP的继承关系

从这个继承关系看到,java里的继承只能有一个直接的父类,这就是所谓的单继承。只能有一个直接的父类,就是说可以有多个间接的父类,父类的父类就是间接的父类。直接父类只能有一个,而间接父类可以有多个。

封装

这里有必要先讲一下封装的概念,我们后面介绍继承的时候,要使用到封装的知识。

在很久以前我介绍java语言特性的时候就稍微说明了一下封装的概念,比如我们很多网站或者app里面填写信息的时候,是不会给你直接填年龄的,而是通过你的出生日期计算出你的年龄,这就是封装。程序为了避免一些常识上的错误会将部分的功能对用户 “屏蔽”,用户是不能直接操作的。

再比如,我们在做项目的时候,肯定不是一个在战斗,而是一个团队协作的过程,在协作的过程中,你会发现各种各样的奇葩队友。一个大家都要使用的方法,专门安排一位 “武林高手” 去写,结果这位高手写的东西真的是惨不忍睹,如果用他写的公共方法肯定是BUG满天飞,到时候还得被批评自己的代码出问题。

怎么办?直接说啊,XXX你这写的什么乱七八糟的破玩意!别激动,这位高手的姐姐的姑妈的朋友的亲戚是你领导,人家是有关系的,你不给点面子?没办法,自己写吧,但是你写的要是被别人发现了,别人也要用你的代码了,这时候,封装就派上用场了,直接在方法前面加一个private,好了,只能在自己类里面用,这个世界从此安静了。

我们设计一个类的时候,有时候跟设计一个软件产品有一些相同的思想。我们对用户屏蔽不需要知道的细节,只留部分我允许的功能暴露出去。好吧说人话,用户虽然是上帝,但是有些上帝喜欢搞破坏,我只能开放一些指定的功能让用户去用,并且保证无论用户怎么操作都不会对系统产生破坏。

按一下就能起飞

再举个栗子,我们开车的时候,是不是只用按一下启动,车就开了?你需要把引擎盖打开,对着发动机一顿操作让他启动吗?发动机就是对用户隐藏了,而那个按一下就启动车子的按钮,就是对用户暴露的功能,我无论怎么按,车的发动机都不会被破坏。这个发动机就是一个私有方法,外部不可见。

访问修饰符有3个,private (私有),protected(受保护),public(公开),还有一种就是你不写,他会有个默认的权限 default。一般来说private 和 public使用最为频繁,而protected是专门用来给子类重写的。下面来看看这几个修饰符。

访问限制

关于继承的一些复杂的,绕口的规定我们下一章继续说。

本文分享自微信公众号 - 码思客(javamsk),作者:码思客

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • super关键字和继承中的潜规则

    关于继承的规矩很多,再加上初学者一般不会有太深的理解,所以学起来磕磕绊绊,绕来绕去,就差死记硬背了,我一直认为死记硬背的学习方法简直就是个灾难。

    用户5745563
  • 想学清楚循环 先搞定这个小学题目吧

    这个题目一出,网上就炸锅了,这玩意是啥?看不懂,不会做,不明白,居然是个小学题目,各种受到1万点伤害啊。后来有大神发帖解答,才让众网友满血复活。其实这个题目的本...

    用户5745563
  • 程序里的运算不止有加减乘除

    运算符很重要,我们会在业务中经常用到运算符来帮助我们解决问题。在编程领域,运算符要比我们已经知道的加减乘除要多一些,包括算数运算,赋值运算,扩展赋值运算,自运算...

    用户5745563
  • [NewLife.XCode]反向工程(自动建表建库大杀器)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简...

    大石头
  • 详解卷积中的Winograd加速算法

    做过ACM/OI的朋友大家应该对FFT并不陌生,我们知道对于两个序列的乘法通过FFT可以从原始O(n^2)复杂度变成O(nlogn),所以我们就会想着FFT这个...

    BBuf
  • MySQL Select语句是怎么执行的?

    最近在极客时间看丁奇大佬的《MySQL45讲》,真心觉得讲的不错,把其中获得的一些MySQL方向的经验整理整理分享给大家,有兴趣同学可以购买相关课程进行学习。

    AsiaYe
  • 在浏览器里查看laravel日志文件

    mojocn
  • 浅谈Lifecycle的原理,以及liveData在Lifecycle的扮演者

    我们知道jetpack出现给android开发带来很大的便利,尤其是Lifecycle带来的方便,作为一个有志向的码农,就应该了解一下Lifecycle的原理

    包子388321
  • js遍历之for forEach in of

    for是循环的基础语法,也是最常用的循环结构。没有兼容性问题,效率上:for > forEach > map >for in

    前端博客 : alili.tech
  • 解密区块链(三):公开的分布式记账

    前面解密区块链(二):中心化的记账方式,我们提到,当前大部分企业,银行及机构都采取中心化的记账方式,带来了安全性及可靠性的问题,虽然采取了加强管理的方式来防范,...

    企鹅号小编

扫码关注云+社区

领取腾讯云代金券