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是专门用来给子类重写的。下面来看看这几个修饰符。
访问限制关于继承的一些复杂的,绕口的规定我们下一章继续说。
网友评论