00:00
好,那今天呢,是咱们第十天,那正好相当于是两周的时间啊,半个月了,这个现在感觉体力上是不是有点累了,都没有啊没有那最好啊,这个还只是比如说跑五千米的话呢,现在你还只是在这个一千米的这个范围之内呢,是吧?啊但是五个月的时间呢哈,嗯,这个这个调整调整这个状态哈,就是我们把这个面向对象讲完以后呢,呃,大家呢,从这个精神上呢,可能稍微呃缓那么一点点啊,因为呢,面向对象里边东西比较多,呃最初学的话呢,难度相对来讲感觉要大一些,当学完面向对象以后,后续的章节其实学起来呢,就要轻松,轻松加愉快一些,当然前提呢,是基于你面向这些呢,掌握的比较好的情况下啊呃,因为咱们后续呢,其实用的这些集合也好,多线程也好,I流也好等等,它其实都是翻来覆去的,哎,去验证或者使用咱们面向对象的内容了,所以大家其实另外一方面也不用非得指望着说我在学面向。
01:00
上的时候我得学的透透的,然后我再学后边的东西,那用不着这样就是你后边呢不断的用,反而呢,更加深你对前面面向对象的一个理解啊,是这种啊,那另外的话呢,就是想象一下这个毕业以后找到一份满意的工作,这种感觉还是挺爽是吧?来支持着你再往前走一走啊,像那个昨天呢,出来一个出来一个大事儿,就是关于这个新浪开年终奖,开开年会的事儿是吧?对,就登头条了都哈,有的不知道是吧?啊就是他们新浪开年会,开年会的,然后抽奖抽到特等奖的时候呢,这个那哥们没在,那哥们呢,结果后来发现是个成员说正在公司加班呢,然后特等奖就给错过了,特等奖多少钱呢?2000的公司股票折成人民币就是77万啊,就错过了一下77万这样一个奖是吧?啊,然后呢,然后就开始抽给另外一个人了嘛,好像是连着抽了六个人啊,第六个人才在,前面几个人都没在啊,但不知道是不是都是。
02:00
成员啊,但是第一个这哥们呢,呃,对,就发了好几条微博,这个就是感觉自己该想离职了,都说嗯嗯,就是说呢,能顶上他这个两年多的这个工资了,嗯,但是这个事怎么进展还不知道呢哈,嗯,就这确实也是一个一个看公司怎么处理了,呃一这个员工呢,你要说请假了就算了,他是因为这个在公司加班没来,这到底该不该发是吧,就是人家后边抽中那个肯定得给了,就是至于说这个还会不会再给他补发一份,那就看公司了,你要说不给吧,人家加班给公司做贡献了,你不给是吧,给吧,那就再再掏一份钱呗。啊就看这个新浪怎么处理这个问题了啊,所以这个发奖也发出问题来啊,当然最好的呢是最好的是现场抽完这个人没在,然后你知道这哥们正在加班呢,这时候呢,就大家都等他,然后这时候一过来夸一领奖,哇,这这个氛围是感。
03:00
最好的是吧,但是你不知道他是请假了还是说正加班呢哈,哎,就是新浪网呢,也算是一个也算一个互联网企业了,就是现在其实互联网这里边这个虽然说今年呢是比较艰难的一年,但是呢还是比较有前的是吧,所以大家呢也是比较有前途的是吧?啊但是呢,身体也很重要是吧,你得你得持续的这个呃,一方面工作,然后同时呢,你这个体力也得能跟得上才行啊然后呢,我们接着来讲的一个新的内容啊嗯,第七个内容叫面向对象的特征一,封装与隐藏啊这呢是咱们讲面向对象呢,咱提到三条主线,这是咱们第二条主线的第一个面向对象的三大特征的第一个,哎,封装与隐藏,简称呢就叫封装性了啊,这个完整点数呢,就是封装和隐藏这样,那我们来引入一下哈,说为什么要封装,封装的作用和含义是什么啊?
04:00
举个例子啊,说呢我要用洗衣机,那我只需要按一下开关和洗涤模式呢就可以了,有必要了解洗衣机内部的结构吗?有必要碰电动机吗?当然是否定的是吧?哎,我要开车啊,你也不需要研究这个发动机啊等等这个这个各种的物理上的一些原理啊,动力传动等等,不用啊,你只需要呢,知道几个按钮就行,那么就相当于呢,对于一个用户来讲,或者对于咱们,咱们是做开发人员,其实咱们呢也可以看成是一个用户哈,那咱们是谁给咱们提供了导致咱们是用户呢?就是比如说写Java的那些API的那些人是吧,他们呢,你算成是第一档的这个开发人员,然后咱们呢,算成他们的用户,因为咱们在用人家的API啊,咱们做的这个项目的话呢,你可以呃,把用你项目的这些人呢,也看成是用户啊,因为他在用你的项目。是吧,从咱们的,咱们跟那个写Java API的这个人比呢,咱们就相当于是人家的一个用户一样哈,那么就相当于是咱们没有必要去了解这里边儿的每一个API的详细的内部细节了,哎,他呢,就都封装成现成的一个一个的类。
05:05
啊,然后类里边呢,提供了一些功能,就是主要呢是方法了,咱们呢,只要知道这里边儿这个,呃,这个功能方法怎么用就可以了,至于说它里边这个细节,按说呢,其实不用你去了解过多啊,又比如说咱们用这个叫尔瑞斯。诶,A瑞里边呢,有这个叫S方法,哎,你只需要知道呢,诶我们这有一个in对型数组,或者其他类型的数组往这一扔,诶就给我排好序了。诶,你只需要用这个功能就行,你就没有必要呢,再非得去关注说里层它是怎么一行一行写这个代码的啊,这呢就比较方便了啊,这个呢,你掉了一个方法,就像是一个普通用户按洗衣机的这个开关一样啊,我按按一下就行,至于说里边这个怎么去一点点调动这个发动机执行啊,这个这个出水,这个放水啊,这个你不需要关注太多。啊,这样使用起来就更加方便了,就啊,那么我们把这个事儿呢,就称作叫高内聚,叫低耦合啊,高内聚和低耦合什么叫高内距,就是类的内部数据,操作的细节呢,自己完成,不允许外界干涉,说白了就是我们给封装起来了。
06:15
这个洗衣机的开关到底隐藏了哪些东西不用你管,这个so的方法里边到底有哪些信信息不用你管,我内部呢都自己完成了,哎,外部呢,你不用干涉,那么第耦合呢,就是我们对外呢,仅暴露少量的方法用于使用就可以了。就是对外呢,我们只提供一个so的方法,直接调就行啊,那至于说呢,这个so的方法,他在里面写这个方法的时候呢,它可能里边还用了其他的一些封装的方法,就好比是咱们自己写冒号的时候呢,咱们不是也把那个交换两个元素顺序的那个抽取出来当了一个方法是吧,就是他可能是在现有的方法里边又调别的方法,这些别的方法呢,如果外界用户用不着他这个也不对外暴露,哎,怎么实现这个不对外暴露,这就是咱们今天要讲这个封装性。
07:05
啊,其实就是通过这个权限修饰符,我把这个权限呢放到足够小,小到呢,就是外界用户呢,根本看不到这里边的这些方法,诶,那就相当于不对外暴露了,然后呢,外界用户用什么,我就对外暴露什么啊这就我们所提到叫高内聚和低耦合,哎,大家体会一下这样的一个点啊好,那下边呢,又有一段话说呢,隐藏对象内部的复杂性。只对外呢公开简单的接口啊,注意这个接口呢,不是咱们后边要讲的那个interface啊,就是你可以理解为只只是对外公开简单的这个API。啊,API那个I其实就是接口是吧,啊API就是这个类库就可以了啊,或者叫具体的一些这个方法功能说便于外界调用,从而呢提高系统的叫可扩展性,可维护性啊从洗衣机的角度,你去理解一下就行是吧,用户呢,只需要用这个,至于说里边呢,具体哪块出问题了,需要扩展了,需要去维修了,这个都是有专门的人来做,就是人家开发这套东西的人来做是吧,不用你管了,就啊通俗的说呢,把该隐藏的隐藏起来,把该暴露呢暴露出来,哎,这呢就是封装性的设计思想。
08:18
哎,有有点感觉不感觉不那么强烈是吧?哎,那下边呢,咱们就得展开呢,通过代码层面去理解啊,所以大家呢,其实在面向对象里边学这些知识呢,这些知识呢,一定要落地到代码上啊,如果单纯的去这些记这些知识点呢,很快就忘了。哎,你通过代码呢,去强化对这些知识的一个理解啊,那咱们就直接呢来写代码了啊呃,这呢,我们通过一个例子来说明这个封装性,哎,我这呢用一个叫animal啊,Animal动物啊,它的一个测试。面向对象的特征一封装性,或者我们叫封装与隐藏好诶隐藏诶隐藏好这块呢,我们通过一个诶题目呢,来引出咱们的这个封装性啊,哎,我这儿呢有一个class,这呢叫一个animal。
09:24
哎,我们通过隐藏它其中的内部的一个结构来体会啊,对于一个animal来讲呢,我们有一个,比如说磁针形的内啊,有个int型的edge啊,然后再来一个啊,比如型的叫leg,这就它的腿的个数啊,对,这样子成,然后呢,它也有基本的这个方法,Public word叫it。呃,这个我们叫动物,不不不叫吃饭了,就哈,它可以叫进食,嗯嗯,行,就写这一个方法吧,嗯,然后的话呢,我们在这个类创建完以后,咱们就可以呢,在另外的一个测试类当中去调用咱们写好的animal,哎,我们首先呢可以去实例化一下。
10:14
好,写完了,写完以后的话呢,我们通过这个A呢,可以去调它的这些属性,比如说name,哎这个附一个名字,嗯,比如叫花花,对花花,这个容易容易这个被粉丝攻击是吧?嗯,这个大黄吧,哎,这一条狗,哈哈,这个这个a.age啊,这个一岁了啊,然后a.leg啊腿的个数,这个来个四条腿啊这样子啊嗯,我们呢,也可以再去提供一个方法呢,让他输出一下咱们这些属性的信息。Public,比如写个show,哎,在这里边我们打印一下啊,比如叫name。
11:03
逗号啊,Age。逗号,然后。好,这个呢,我们就输出一下这几个属性的这个基本信息,当我们赋好值以后,我通过这个A呢,可以去调用这个收方法,哎,就显示一下它这个基本信息是多少。哎,是这样子的,这个目前大家都能看得懂吧,哎,对啊,就是咱们说这个收方法里边呢,是可以调属性的,这是第一个,第二个,诶当我们调这个收法的时候,里边这个属性值到底是多少,那就是嗯,这个谁掉的受方法,我这呢属性就是谁的,哎,我们此时呢是A掉的,那我显示的就是A的这几个属性值,A上面付过了,所以自然而然就有结果啊行,这是我们之前讲过的内容,嗯,那现在的话呢,我们想体会这个问题哈,这呢是一个正常的情况,如果呢,下边像我们这个A,我去给这个其中的这个属性叫LA赋值的时候,我负一个负四。
12:12
你会发现呢,这个编译运行也都不报错,我们都要瘦的话呢,也能出来。哎,这那就是个负词了,但事实上呢,通过这个实际问题,除罚哈,我们知道这个X呢,是不可能负这个负数的,哪怕你负个零都都都还可以忍是吧?啊这个负数呢,是肯定不可以接受的,那就意味着在咱们实际开发当中呢,哎,会有一些呢额外的限制啊,就是额外的限制,比如说咱们呃,这个起个名字的时候是吧,这个我们在注册一个信息写名字的时候呢,它这里边就限制说你这个名字这个长,长度不能太短啊,这个又不能过长啊,或者说你这个名字呢,被别人占用了等等,这都是属于一些限制条件,这个限制条件我们会发现呢,你要想在我们这个属性声明的时候呢,体现。
13:02
实际是有些困难的,呃,我们在给这个legs赋值的时候呢,通过这个属属性这块只能够体现出来就是它的类型啊,你得写这个整形的,然后呢,你这个lax呢,你不能超出这个整形int的这个范围。这时候呢,他报错了,只要你在这个范围内呢,那其实还是有点太宽泛了,他呢就限制不了了,哎,那现在咱们就得说我怎么去给这个X加一个限制,限制呢,就是使得比如我们在给这个X赋值的时候,只能让它负正数,而且呢,你也可以限制它只能数负这个正的偶数。那大家想我们怎么去限制这个条件,哎,我们就得考虑通过方法了,因为呢,咱们也知道啊,刚才一说限制说只能负正的偶数,那其实就是一个分支啊是吧,一负语句了啊,那你这个一负语句你肯定不能写到这了。这些结构的话呢,咱们都得体现在方法当中,所以说呢,咱们可以考虑呢,就提供一个方法啊,这个方法呢,就是专门来给咱们这个leg属性的赋值的。
14:10
就给它赋值的啊,那你想想我这个要不要返回值啊,赋值你就光赋个值就完了,不用返回什么吧,不用啊,所以这是个VO,我呢把这个方法就叫做set like set就设置的意思啊,需要行参吗?那肯定需要了,你给赋值,赋值你不得带一个值过去嘛啊好,我呢这里边就拿这个L赋给咱们的LA啊,就先先我这样写一下啊,付给他,这就相当于是谁调这个方法,你就填一个L,然后呢,我就把这L付给你这个调方法的那个对象的你自己的这个Le属性。啊,就这样子就行啊,那咱们说呢,在这里边咱们就可以加入这个逻辑了,说我们判断一下说啊,如果你这个L呢,首先呢,你得是大于等于零吧,哎,其次哎,我们要求L呢,还得是个偶数。
15:10
嗯,只要你这样满足的话,我就允许你付。哎,这不就这样的情况,然后要不的话呢,我就不允许你付是吧,不允许付呢,咱们也可以指定一个默认情况,比如说我这个默认的就像你这个是个零是吧,哎也可以,或者的话,咱们后边呢,会讲一个,就是可以去抛出一个异常,哎这个咱们暂时没有讲啊。这个到后边呢,咱们再说就是你这块呢,要负的是一个负数啊,或者是一个奇数,我这块就抛异常告诉你说出错了,哎,咱们暂时的话呢,比如说先先这样写一下啊,后续呢,咱们再考虑通过这种方式去完善成,那这块的话呢,咱们就可以通过这个方法去调了啊,那这块的话呢,比如我就不这样写的,咱们呢就写的A点,我叫set like,当我写的是一个,比如先写个六啊。
16:05
写六,这时候呢,这个六满足这个条件就附上了。哎,你看这就附上了,嗯,当我们把这个注释调啊,复制一份啊,把这个注释调,我现在呢,写成一个负六。负六的时候呢,我们不满足这个式子就进到这儿了,哎,它这呢就哎就给你默认就负了个零了,哎你看这就出现零了,就是不不不让他负这些所谓的这个负的这个情况,哎这样就行了啊,那其实这时候还有一个问题啊,就是咱们呢,确实是提供了一个方法,然后呢,让用户呢调了一个方法,诶去给它赋值。但是这时候呢,其实我们是不是还可以去调这个LA啊,既然我还可以这样调,那你是不是还是避免不了用户这样去写,然后呢,还输入一个错误的情况,那我们这时候还得怎么办?对,就是除了我们告诉用户说你通过这样的方式呢更合理之外呢,是不是要把那种不合理的方式给禁掉。
17:14
对吧,就是用户呢,比如说他非得要这样走,你现在告诉他说别这样走,然后你这样走,但是你告诉他这样走的同时,他可能还会这样走,你得把这个呢,打个叉都不允许通行了,这样的话呢,他才都从这走,这不很合理的一个思路嘛,所以呢,我们这时候得一方面啊,提供一个方法,通过方法呢去写这个,呃,这个限制条件,哎,让我们给这个属性赋值,那同时的话呢,我们还把这个直接调属性这个事儿呢,给他禁掉。怎么禁调就通过这个所谓的叫权限修饰符来体会,哎,我们呢,将咱们这个likes呢,生命成一个叫private。私有的,那一旦生命完以后,你会发现我们上边这个Lex直接掉的这种情况呢,就报错了。说the field或这在这加个注释哈,说the field animal.likes这个属性is not visible。
18:09
叫不可见。啊,这叫不可见,这个不可见它跟没有定义是两回事啊,比如你看我这写个next,我后边加个一,他也报错,你看这时候报的错。说你这个没没有保存,或者说不是一个属性,就说白了,就你这个变量我我找不着是吧。这个的话呢,我要写成是他呢,你说他编译器知道我们这里边有这个属性,不知道知道对他知道你有,哎知道有,但是呢,有不等于能用,有不等于能用,因为呢是人家私有的。就像你在路上你看到了一个女生是吧,那个女生呢,确实就在那儿,还特别漂亮,但是呢,不等于你有,那是人家的女朋友是吧?啊就是你能看到跟是你的是两回事是吧?诶对这个Les呢,就是说他确实有,但是呢,你不能掉啊,这是人家的私有的啊这样的啊,那这样的话呢,我们就哎好办了,那一方面呢,咱们提供一个方法,哎能够让你呢去赋值加入一些条件,那另外一方面呢,我们还把直接调属性这个事呢,给你禁掉。
19:21
啊,那此时呢,就能够达到一个对这个属性的,实际上就算是一个封装了。就是咱们相当于这个属性,是不是就没有直接对外暴露啊。哎,你可以这样想啊,咱们这个类呢,就像是一个盒子一样啊,这个盒子的边界呢,就相当于我们这个大括号了啊,然后在这个里边呢,我定义这个属性呢,叫做Lex,这个属性呢,真实的存在我们这个类当中啊,现在呢,我们想去调这个Le呢,现在以前呢是可以啊,直接就能掉了,现在呢说不能直接掉了。我呢把它加成一个private了,哎,然后呢,你要想调,我这呢,给你提供了一个口,这就是所谓的叫接口了啊,哎,我叫一个public的哎,叫做set like,你通过这个口这个方法进来,你去调它,不要直接调它。
20:14
啊,就相当于我们对这个LAS呢,进行了一个封装,或者说呢,进行了一个隐藏,使得呢,我们对外呢,不能够直接看到它。注意你看我说的是不能直接看到它,可没有说呢,没有它了哈,还有的这个生命成private,这个属性仍然会有,那就意味着呢,当我们去造一个对象的时候哈,咱们堆空间中是不是会加载这个对象的属性啊,那我们这时候属性这个类里边有仨哈,这个like加上private了,那你说这个对空间中的这个对象属性有没有like?诶一定有一定有啊,只不过呢,这个LAS呢,跟前面这两个暂时有点区别,就是它的权限很小,小到呢就是让用户呢,让我们通过这个引用名叫A占空间的哈,不能够直接调它了。
21:05
不能直接调,这叫is not visible啊,但是呢,不是说is not exist是吧,不是说它不存在啊,存在呢,只是调不了啊,这就体现了叫封装性或者叫隐藏性。啊,你作为一个就是有时候小时候经常会幻想,不知道大家会不会幻想啊,就是自己要么会飞了,要么会隐身了是吧?哎,但是你能隐身,只是说你隐身了,其实你还在,别人要碰你一下的话,那其实他能他能碰到你是吧,只是他看不到你了啊,就是你还在,并不是说你消失了啊,所以隐藏的隐藏,只是说它看不到了,或者掉不了了,但是它还存在啊。从另外一个方面呢,我们还可以证明它是存在的,就是诶我们是不是也调这个方法了,你通过方法呢,比如我这要写个六的话,你是不是确实也给赖附上值了。对,既然你能附上值也没有报错,那说明人家确实有啊,你要是调这个Le报错了,说这个变量没有,它就报错了,这个没有报错也附上值啊,说明它就是有,只不过呢,你不能直接掉了,哎,我们叫做封装隐藏啊,行,这呢就是咱们引进来这个封装性的一个,哎,知识点啊,这呢,咱们可以写一个问题的引入,哎,问题的引入啊,是这样啊嗯,当我们创建一个类的对象以后。
22:26
哎,这呢,就是咱们这个animal这个类的对象,创建这个类的对象以后呢,说我们可以通过哎叫对象点属性的方式,哎,然后对哎我们这个对象的这个属性进行调用,或者叫进行赋值,对对象的呃属性。进行赋值,哎,这个是没有问题的啊,那么我们说这里呢,呃,赋值操作啊,要受到这个数据类型和这个对应数据类型存储范围的一个制约啊。
23:06
这里呢,复制操作要受到这个呃,属性的数据类型和这个存储范围的制约。就是说呢,你这个是in的型的,你不能负死string型或者是double类型啊,那同时呢,是in的型的,你不能负的这个数超出int的范围,就这个意思啊,来受这个制约,但是除此之外。你看没有其他制约条件。啊,那接着说呢,或者这个但是去掉了啊,除此之外呢,没有其他直接条件,但是呢,在实际问题当中啊,我们往往需要给这个属性呢,加一些额外的显示条件。需要给这个属性赋值加入嗯,额外的这个啊限制条件,那么这个限制条件就不能在属性声明时体现啊,因为呢,我们这就是定一个变量,你你不可能在这儿加一个很复杂的这个if else啊等等这种结构了啊,这是做不到的,那么不能在这体现了,那么我们只能哎,通过这个方法来进行这个条件单添加。
24:28
前提条件的这个添加。哎,添加啊,比如说就是咱们刚才写的这叫set这个。哎,这就是我们这个比如的这个例子啊,那那我们现在呢,就提供具体的这个方法啊,在这个方法当中加入你对这个属性设置时候的一个限制条件啊,那加完以后的话呢,发现还有问题,同时哎我们需要哎这个避免用户哎在使用这个对象点属性的方式呢,进行属性的一个复制,哎我们需要避免用户再使用这个样的方式呢,来对属性来进行复制啊那么则需要哎将我们这个属性声明,将属性啊声明为这叫私有的,那这个私有的呢,就是叫private的意思,行,那这样呢,我们就把这个事呢就说清楚了啊,那这里呢,我们对这个属性就体现为是一个封装性啊啊这呢我们这样写下,呃,此时啊,针对于这个属性啊。
25:43
就是封装性的就体现了啊。哎,封装性,哎或者说呢,我把它给隐藏起来了,哎就是这个意思啊,行这呢相当于是咱们一个问题的引入啊,大家能够理解我们刚才说的这样的一个情况啊。
我来说两句