00:00
好,那刚刚呢,我们说了一下这个狗这个类,然后说了一个问题,就是我们现在这个对象当中的属性全都是对外直接可见的,也就是说你是可以任意去修改的,对吧,那现在我们就希望做一件事,什么事呢?就是说我们这个属性我希望是由我们。类的定义者来控制,我希望你能,我让你访问,你能访问,我不让你访问,你就看不到,我让你改,你就能改,我不让你改,你就改不了,我们现在需要做这样一件事儿,对吧?那这里边我们就要说到我们面向对象的一个特性,我们来创建一个新的文件,叫做什么呢?叫做一个封装,封装啊,我们面相对象有三个特性,那封装是其中之一啊,那我们先写一下封装是我们这个面向对象的什么呀?哎的特性之一啊,面向对象有三个特性,我们先说第一个,封装是我们面向对象的三大特性之一,哎,三大特特性之一,那什么叫做封装,那封装又代表的是什么意思?那其实咱们就还是先从字面上理解,装干嘛?我把东西装起来对吧?我把东西装到兜里,是不是就装啊,哎,装收起来,哎,那风呢,哎风我不让你看见啊,不让你看见,你说我把东西是不是藏起来,哎,所以。
01:20
这皆看字面上的意义,就是我把一个东西给它藏起来,不让你看见啊,不让你看见,那在这儿的意思是什么呢?其实基本上是基本上是一样的啊,基本是一样的,那封装指什么呢?诶封装指的诶,诶是隐藏什么呢?诶隐藏我们这个对象中一些什么,哎,不需要被诶不希望诶被我们这个什么呀,哎,外部所访问到的这个属性或方法啊,也就说我现在定一个类,我定义这么一个属性,有一些属性是我对象内部自己用的,有些方法可能也是我对象内部自己用的,而这些属性,这些方法我可能是不希望外部所访问的,那这个时候我们就要干嘛呀,给它封装起来,给它藏起来干嘛呀,哎,不让你看见啊,所以封装就是隐藏对象中一些不希望被外部所访问的属性和法,那比如说我们刚才定义这么一个狗的类啊,我复制一下。
02:20
不全复制,我们复制一部分,那狗这个类呢,现在里边我们有这么多属性,有四个属性对吧,我现在就留一个啊,就留一个,那比如说现在狗里边有一个name属,就剩一个name了,对吧?我们来创建一个这个东西,直接来一个D,等于一个这个dog,那这时候我们传一个name,我们叫一个旺财,那现在我直接print一个,直接来一个D点一个name,我这一执行旺财对吧?哎,我这个现在是不是也可以改呀?哎,我直接D点一个name,哎,等于一个什么呢?等于一个小黑,小黑这一保存一执行是不是变成小黑了,也就是说现在这个name属性,我外边是既可以读,这是不是在读取这个属性啊,也可以改这个赋值,是不是在对属性进行修改啊,也就是说现在我这个内幕属性有没有隐藏起来,没有隐藏起来啊,是完全就是放开的,你想怎么看就怎么看,想怎么改是不是就怎么改啊,所以现在我们这个对象没有用到封装啊,没有用到。
03:20
我说那怎么办?那现在我们一步一步来,一步一步来,因为我们既然要说封装了,就涉及到两个东西,一个是我给你藏起来,二一个我我要全藏起来,我对象也没有意义了,我是还要给你露出一部分呀,哎,就像我们穿衣服一样,对吧?你穿衣服你把身体全盖起来了,是是严实的,别人什么也看不见了,那不好看,可能容易把你憋死了,没有意义,对吧?所以我们穿衣服,诶该挡的地方我们要挡起来,哎,不该挡的地方是吧?我们要给它露出来,对象也是一样,有一些东西我是不希你访问的,所以我要把它藏起来,但有一些东西我是希望你访问的,那我要干嘛给它露出来,对吧?那现在比如说这个name属性,我们先考虑第一个问题,我们如何去隐藏一个属性,哎,我们第一个,哎如何去隐藏,哎一个这个对象中的什么呢?属性如何去隐藏,我们先考虑第一个问题,我们先把藏起来,然后再考虑如何让你访问,对吧,如何去隐藏。
04:20
那现在比如说现在这个内部属性,我不望你外部访问的,也就是说我希望你这个这个内部属性,你压根儿就访问不到,那怎么办,那怎么办。想想思考一下这个问题怎么办?我不希望你访问到我对象里的一个属性,这个属性我希望你压根儿就看不见,怎么办?想想。哎,想想你想想你有一辆自行车。你现在不希望你的自行车被贼偷走。不希望自行车被雷特,最简单的方式怎么办?哎。
05:00
你把自行车藏起来,你让贼看不见这个自行车,或者你让贼是不是不知道你的自行车在哪就行了呀?哎,在哪同理,那现在我有这么一个属性叫name,而这个属性我不希望用户访问到,我不希望使用对象的人直接去访问我这个属性,那我怎么把它藏起来,哎,我让他不知道我这个对象的属性名叫什么不就行了吗?对吧,所以我们隐藏对象的属性最简单的方式就是什么,哎,就是我们这什么呀,将我们这个对象的这个属性名,诶修改,修改为一个什么呢?哎,外部不知道的名字,比如说你现在之所以能改,是因为你现在知道这个名字叫name,对吧,那我把这名改了,我不叫name了,你是不是就改不了了,那比如说我现在改成一个直接S点一个hid hidden一个name hidden叫做一个隐藏啊,Hidden一个隐藏,那现在注意我现在这个self里边的是不是叫hidden name呀,它不叫name了,那这时候你再改,你再改name还好保使,哎,比如说啊这样我们这里边再定一个方法叫做一个c hello,定一个方法我们叫做一个say hello say hello呢,我在这儿简单点写,直接写一个这个print print一个,哎,百分之S我们这来。
06:27
这个这个大家好,哎,我是,然后这来一个直接百分之,我们来一个self点一个name啊self点一个head name,那注意了,这个时候你这里边就不能写用name了,这得用什么了,Head name了,因为这个名字你你改了,你这是不是也得改啊,哎也得改,那这时候我们来看效果啊,我们来看这这我来直接调一下D点一个c hello直接调一保存走一个是不是大家好,我是旺财啊哎我让旺财,那你想改怎么改呀,我来一个D点一个这个name d点一个name等于什么呢?等于一个小黑,我是不是又改这个name属性了,哎你这确实是改了,确实是改了,但是你这里会不会影响到c hello会不会影响到我这一执行走一个是不是还是旺财啊,诶,还是旺财并没有影响到那个name属性,为什么?哎,因为我这里边已经不叫name了,我叫什么,我叫hidden name啊,我叫hidden name不叫name,所以你在这儿是不是就改不了了啊在。
07:27
这是改不了了啊,那同学说了,老师,那他如果是写的是地点had name,他这不还是依然能改吗?对吧,是不是也是改了,诶确实也是改了,但是这样就比那个name是不是没有那么直接了,哎,没有那么直接了,那注意啊,我们这个所谓的封装,所谓的封装,待会儿我们会讲各种封装的方式啊,各种封装方式我们先强调一点,我们没有任何一种方式,我说可以我把这个属性完全的藏起来,没有一种方式,我说藏起来以后外边就访问到了,没有,我们这个叫什么呀?叫防小人不防防防君子不防小人,什么意思啊,我就告诉你这名儿,我不告诉你是什么,你就改不了,但是你非得说你去找这个名,你要改,那你还是能改的,所以它并不是绝对的安全啊,并不是绝对安全,没有这种方式啊,所以我们这里边注意你要去改它还可以改,但是我们在这儿就避免了什么呀,你这种简单的方式,你是还得去猜我这名,比如说我这改了叫abc.name ABC下线name,那你又不知道你是不是就猜不出来,哎猜不出来,所以这里边我们是一个,诶比较一个弱的。
08:36
哎,弱的一个封装的方式啊,封装方式好,那现在我们说了,那现在这个名字如果他不知道,他是不是没办法直接改了,哎没有办法直接改了,好那这块又来问题了,也就是说我们现在怎么藏属性会了,怎么藏,就是改属性名,诶我改一个你不知道的属性名是不是就OK了,哎改一个不知道属性名就OK了,那这里就又来了第二个问题,那现在我这属性藏起来了,藏起来以后。
09:07
那有的时候我这属性是不是我还需要让你看见呀?哎,那你说如何让什么呢?哎,如何获取我们这个如何获取修改我们这个对象中的这个隐藏的属性中的属性,也就是说现在你的这个哎属性已经藏起来了,也就是说现在说白了这个东西hidden name在外边是不能访问的,其实是我们规定的我们不能访问了。但是现在这个东西在内部是可以用的吧,外部不能用,但是在内部是可以用的,那这个时候我现在希望在外部也可以获取到这个值。那怎么办?或者说我也希希望通过外部去修改这个值怎么办?那你当然不能直接d.hand name等于那个,那你这么这么写完了就没写一样了,对吧?那怎么办?那我们来说一下我们的通用方式,那怎么办?那我们需要什么呢?我们需要提供一个什么呢?提供一个这个get。
10:14
哎,合什么呢?哎和方法。哎哎,使什么呢?哎,使我们这个外部可以访问到我们这个属性啊,访问到属性这是我们通用的啊,通用的也就是说我不要你直接访问,我给你提供两个方法,通过这两个方法你可以去操作这个属性,那我们先说第一个方法叫做一个get get get叫什么呀?Get叫做一个获取啊get方法它干嘛呢?它叫做一个获取我们这个,诶对象中的这个指定属性啊,获取我们对象中的指定属性,那注意啊,这个方法名我叫get,并不是说这方法就叫get,这方法叫什么呀?这个get方法的格式叫做一个get下划线。
11:03
属性名啊,这是这么一个东西啊,Get下划线属性名,那所以现在比如说我现在希望外部可以访问到我这个head name,那我要怎么办,那我怎么办,那这里边我们就需要定一个方法叫什么呢?诶DEF叫什么呢?叫做一个get,这是我们的命名习惯啊,Get后边跟属性名,属性名叫什么呀?注意属性名不叫head name叫name he name是我们隐藏的一个属性名,但是它的属性名真实的是不还叫还是叫name呀,啊,还是name,所以我这叫一个get name啊get name get name,它是一个方法,里边就也需要一个什么呀,Self啊self,那get这就是一个什么呀,Get方法啊,Get方法,Get方法用来干嘛?我们来再写一下。Get的方法,哎,我们来写一下,这叫叫做一个get name用来干嘛呢?哎,用来获取我们这个对象的一个内幕属性啊,用来获取对象的内幕属性,那现在我们来看那怎么获取啊,哎,非常简单,直接来一个什么呀,Re r return,一个这个self,点一个hidden name,也就是说你要想获取name,你直接调一下对象的get name,它是不是直接把这个name给你返回了,哎,给你返回了看效果啊,看效果在这你不是想获取name呢,我直接来一个print,来一个D,点一个get name,没有任何参数,直接一执行,是不是旺财就获取到了,哎,旺财就获取到了,那这个就是我们的一个什么呀,一个get方法啊,它可以用来干嘛呀,用来获取我们这个对象的name属性,那再来说这是get方法,下边一个我们叫做一个set set什么意思?Set叫做一个设置,用来干嘛呢?它用来。
12:48
哎,设置我们这个对象的一个指定属性,它的命名方式叫做什么呢?Set下划线跟着一个属性名,这是用来设置的啊,用来设置的,那现在我们来看一下,我们来尝试定义一个set set方法直接定义,诶一个方法我们叫做一个set,一个name,是不是设置属性啊,那注意了,Set方法你就不能仅有一个参数了,Get因为是获取你就一个参数型了,而set我们是不是要设置啊,你要设置是不是要是修改我们这个属性值啊,你要修改这个内幕的属性值,那这个时候你注意了。
13:23
你修改你改成什么呀,对吧,你得改成什么,你是不是得告诉他呀,所以在这儿还得需要一个参数,这这就是什么呀,Name,这个name表什么意思,你改变的一个什么呀,心值,你把它的值改成什么,那这个时候你要改就是什么呀,Self点一个hi name等于什么name,那这样如果你要想改这个属性,我们可以干嘛呢?我们直接写一个调用我们这个set来修改我们这个name属性,那怎么改?你直接D点一个set name,我里边传一什么呀?哎,比如说我传一个这个小黑,小黑这样一保存我们来看啊,这改完了,这是不是打印啊,这一保存get内是不是变成小黑了,如果你在这再调一下c hello,我们先改之前调一下,然后改之后调一下啊,看效果,这一保存开始是旺财,是不是后来变成小黑了,哎,变成小黑了啊,这怎么办,这个也打开吧,诶开始是旺财,后来小黑,也就说现在我是不是通过。
14:24
Set name就把这个东西改了,诶给改了,那所以这是我们通用的一个方式,第一个我们要做的事,我们需要把属性名藏起来,也就说我要让你不知道我这个属性名是什么,第二种方式,我要干嘛?哎,我通过get方法让你干嘛呀,可以获取到这个属性,通过塞方法可以干嘛,让你可以什么呀,设置这个属性,那这个是我们一个最通用的一个设置方式,那同学看到这儿了,老师这是不是确实是有点麻烦呀,哎,确实是麻烦,因为你以前你就不用管,你直接写name就完事了,现在你还得把名儿改了,然后你还得整一个该乘法,还得整一个什么呀,S乘法,诶确实是麻烦,但是好处什么?好处是增加了什么呀,我们数据的一个安全性,那注意了,我们来说一下使用封装,哎使用封装,诶确实哎增加。
15:24
加了我们这个类的一个什么呀,类的定义的一个复杂程度啊,复杂程一下就上来了,也就说你每一个属性都要配两个方法,Name你要配一个get一个,但是有A你还得配置一个,诶geter还有什么呀,还有这个粘ER你还得配一个get和,也就说一个属性就要对应两个方法,一个属性就要对应两个方,十个属性你就要对应什么呀,20个方法麻不麻烦,确实很麻烦啊,确实很麻烦,哎确实增加了类的定义的什么呀,复杂程度,但是确什么呀,哎,确,但是它也确保了我们这个数据的一个什么呀,安全性啊安全性先说第一个它有什么特点,第一个啊,隐藏了什么呢?隐藏了我们这个属性名啊,隐藏了属性名是什么呢?使我们这个,哎调用者调用者,诶无法随意的什么呀,诶修改我们的什么呢?诶修改我们这个对象,无法随意的修改我们对象中的这个属性。
16:24
这是我们第一个啊,第一个,然后第二一个干嘛呢?哎,增加了什么呢?增加了get和C方法。Set方法干嘛呢?哎,很好的,哎控制了我们的什么呢?我们这个属性是否是只毒的啊,是否是只的什么意思?之前我们没有get和set的时候,我们这个属性name属性,比如说我还是最初那个状态,我这写一个name,那这个name属性你在这儿是不是既可以改又可以读,诶你现在我在这赋值是不是等于在修改啊,在写对吧?写入这个属性,当我在这儿打印的时候,我是在读取这个属性,也就是说它既是可读的又是可写的,而且这个东西干嘛呀,我们没有办法控制他,想读就读,是不是想写就写呀,哎,想写写我们没有办法控制,而这里注意了,我现在我读取通过get,我设置通过set方法,那我读取和设置对应的不同方法有什么好处?如果你的这个属性是只读的,比如说我只能让你读,不能让你改怎么办?
17:35
我是不是把这set方法去掉了,我把set方法一去,你这时候能不能改了,你这一执行是不是就报错了,因为是没有这个STEM呀,你就改不了了啊,那如果你这个属性你不想他读,你就把get方法去了,你既不想让他读,也不想让他写,就是一个内部属性,你把这两个方法干嘛呀,全去了啊,全去了懂那意思吧?哎,增加了get和三方法,很好的控制属性是否是只读的,也就是说什么呀?哎如果希望属性是什么呀,是只读的,只读的则可以什么呀?哎则可以直接去掉什么呀?哎去掉我们这个塞点什么但什了如果什么呢?哎如果希望属性什么呀?哎不能被什么呀,外部访问,哎则什么呀?哎则可以直接去掉什么呀,去掉我们这个开方法,也就是说有了这种方式以后,我们可以控制我们这个属性更加灵活,我让你读哎。
18:35
我就来个不让你读我就不写我呃不是get是吧,让你读我就写get,不让你读我就不写get,不让你设置我就写,不让你设置我就不写,这样我们这个属性的控制是不是更加的灵活呀,哎,更加的便利啊,更加便利,这是第二个特点,那还有什么好处啊,还有什么好处啊哎,那第三一个什么呀,诶那我们说了,使用我们这个S方法干嘛呢?诶设置属性诶可以什么呢?可以增加我们这个数据的什么呀,数据的一个验证啊,数据验证确保我们这个什么呀,诶数据是正确的。
19:13
数据的这个值是正确的什么意子?咱们举个例子啊,举个例子,之前我们在这有一个H,我们演示了,你发现我给H负一个负值,负一个一,负一个100,我复制个hello,我是不是想负什么值就负什么值,对吧,想负什么值就负什么值,但是现在我们有了get set方法,也就说我要去设置这个A,我是不是用的是set方法,我可以怎么办?看着了啊,我这来一个来一个来什么呢?我来一个age,那我这再加一个属性吧,Self还是一个点一个这个hidden hi DD in啊hidden hidden,一个这个edge等于什么呢?等于一个age,是不是给它赋值啊,那现在我要让它可读,我需要定义方法啊,先来一个,那既然可读,我们先来一个get,一个这个age获取年龄对吧,获取年龄,我就直接return一个这个self,点一个这个诶,Hiddenage对吧,Hiddenage。
20:13
然后呢,我再来一个定义,一个叫什么呢?叫做一个set age set edge呢,我就直接来一个这个self,点一个这个page的age,诶等于个H,当然我这还得传一个参数,因为我这需要一个新的年龄,对吧?新的年龄好,那这整完了啊,我们来看效果,那现在呢,我们这就不get name了,我这来什么呢?Get一个age get age,当然我这里传edge了,对吧,我传一个八岁,这一保存一执行是不是age就是八岁啊,那我要想设设置呢,直接来一个D,点一个set,一个age,我来一个十,这一保存年龄是不是变成十岁了,哎,就设置上了,但是这块现在我这儿还是来一个副十,现在能不能设置啊,一直行是不是还是能设置啊,哎,你这跟刚才不没什么区别吗?确实没区别,但是注意了,现在我设置是不是通过方法去设置了,那既然是通过方法去设置,在这里我就可以去验证这个值是否有效那。
21:13
比如说什么呢?我在这儿就可以来一个判断,If一个A大于零,如果大于零我才复制,否则干嘛我就不复制,是这意思吧,那这个时候我们再看复时还能不能复制上去了,诶就复不上去了,也就说在这儿我可以对数据进行检查,如果你仅你没有get set,你现在你是不是直接赋值啊,你直接赋值的时候,它是没有任何检查的,所以非常的不安全啊,非常不安全,但是我通过set,它是一个方法,我在去赋值的时候,实际上掉一个方法,在这方法里边我是不是可以写很多的逻辑啊,诶可以写很多的逻辑,那这样是不是就可以去确保我数据的一个准确性,一个安全性啊,诶这是第二个特点啊,第二个特点在这儿可以对数据进行验证啊,我们这来说一下,诶,在三大方法中可以什么增加数据验证,确保数据的什么呀,值是正确的啊,值是正确的,好,这是第三个一个,然后第四一个,还有什么呢?哎,那我们说了使用。
22:13
使用我们这个geter方法,Geter方法,哎获取属性使用什么呢?使用我们这个cer方法设置属性,哎,我们可以什么呢?我们可以在诶属性在这个读取属性和什么呢?诶和获取诶叫什么呀,读取属性和什么呢?诶和修改属性的这个同时诶做一些其他的一个什么呀,其他的处理啊,其他处理呃。比如说比如说呢。我们之前没有geter和sat,诶我要去读取这个的name幕属性,我要读取这个DOGDOG的name幕属性,那这个时候我读就读了,你读你就是在读取一个属性,获取到属性,我们什么也做不了,因为它就是简单的从内存里加载一个数据,对吧?但是现在不同了,诶同样啊,修改也是一样,我们设置就是设置,就是修改一个内存中的数据,不能做其他的,但是现在不一样了,我们读取的时候用的是get,设置的时候用的是set,哎,那这时候干嘛呀?诶你读取的时候我可以这打印一个通知,比如说我这来一个诶,Print完了,诶用户读取了我们这个属性,然后呢,这儿我们来写一个print,来一个什么呢?来一个这个,诶用户修改了我们这个属性,这一保存一执行是不是修改了属性,这就会有一个提示了,哎就有一个提示,就说我可以在你修改属性或者是读取属性,同时我是不是做一些操作,哎做一些操作,但是现在这个操作没什么意义啊什么。
23:55
意,但是在我们实际开发中是很有意义的,比如说我们这个类是定义的一个商品,商品是有价格呀,那我可以干嘛呀?我可以在用户去查询价格的时候,我去记录一下,诶这是用户查询了一次,再查一次,我再加一变成二,再查一次变成三,再查一次变成四,比如说我用一个计数器来记录他查询价格的一个次数,那这样什么好处?诶,我一看这商品用户的查询了100次价格,但是发现只有什么呢?只有一个人买,那可能商品价格有点贵,对吧?那可能用户查了100次,100个人全都买了,那这个商品比较火爆,我是不是多预备几个呀?那这样当你去查询的时候,我就获取到一个通知,同样当你修改的时候,我也可以获取到一个通知,你去修改这价格了啊,我这个这个价格被这个谁谁谁改了,什么时候改的,哪天改的是吧,我都可以同时去记录一下,那这样是不是方便我们对数据进行进行管理,诶进行管理,那其实基本上和第三点差不多啊,差不多类似,都是在这个读取和这个设置使的同时做一。
24:56
别其他的操作,哎,或者说比如说我再去修改一个属性,这个属性发生变化了,我就给管理员发个邮件,我通知一下管理员这个属性发生变化,你是不是要注意一下他是是是是,比如说你的用户名密码对吧,你密码被改了,我是不是要给你发个邮件通知啊,那我就可以干嘛呀,当你用户那个set name set方法被调用时,我就给你发送一个什么呀,发送一个通知,告诉你密码被改了,那你看看是不是你改了,不是你改的,赶紧去看看号是不是被被盗了,那这些我们是不是都可以在这个get,还有这个C方法当中去完成啊,哎,S法当中去完成,那这个就是我们一个什么呀,封装,封装的一个总体思路其实非常简单,第一个就是隐藏我们属性名,也就说我让我的属性名对外部是不可见的啊,这是第一个,然后第二一个干嘛呀?哎,我通过该方法去读取属性,通过三方法去设置属性,注意这两个特点,Get方法是有一个返回值的,返回的是什么?返回的是你要获取那个属性的一个属性值,而。
25:56
方法是个嘛呀,是需要一个参数,这个参数什么是你要设置那个属性的一个什么呀,属性值你设置什么就往里传什么,行,因为你要进行修改,但是set方法是没有返回值的啊,没有返回的好,这个就是我们封装的一个简介,那注意了,封装是我们面向对象三大特性之一啊,三大特性之一,那具体操作方式我们待会儿再往下,具体来说,但这个是我们一个最基本的一个操作方式啊,把这个东西去理解一下,体会一下它的好处啊,体会下它的好处,我们来听一下。
我来说两句