00:00
好,首先呢,复习一下,打开咱们的E。哎,这个课件的话呢,也打开一下啊。嗯,复习一下这个面向对象啊,还是这个上,咱们昨天呢,相当于把这个上呢就给结束了,在之前的话呢,我们把这个方法,方法里边涉及到重载,可变形参直传递递归啊,这就完事了,然后我们昨天的话呢,上来呢就开始讲这个叫封装性,封装性呢是我们面向对象的特征之一,也是我们讲的第一个特征,其实相对来讲呢,不是特别复杂,包括呢,后边我们要讲的继承性,其实也不是太复杂,就是一说呢,大家基本上就能明白它到底是一种什么样的想法,这个都会比较清楚啊,这个多态性的话呢,会稍微麻烦一点,大家理解起来呢,会有一点难度,讲到的时候呢,咱们再说封装性,首先呢提到了说我们为什么要引入封装性。
01:03
咱们昨天一上来的时候呢,在PPT里边看了一段文字,这段文字呢,其实就给了这个说明。在这儿呢,一方面呢,我们设计程序啊,追求的叫高内聚和低耦合,什么叫高内聚说呢,我们习惯上把这个内部的数据啊,自己的这个细节呢,自己来完成,对外呢就不需要他们干涉了,其实体现为我们封装这块呢,就是可以考虑把他们是不是都私有化呀,就是这个体现。第耦核呢,就是对外呢暴露少量的方法呢,供外边使用,就是我们需要你外边调什么的,我就给你开放这样的一个功能,哎这样的话呢,就体现为我把它声明的权限呢变大一些,这就叫高内聚和低耦合,那具体解释的话呢,隐藏对象内部的复杂性,只对外公开这个简单的接口,便于外界调用,从而呢提高系统的可扩展性,可维护性,通俗的说,把该隐藏的隐藏起来,该告暴露呢暴露出来出来,这就是封装性的一个设计思想,大家现在来看呢,应该是比较清楚了。
02:10
都归结于我们对四种权限的理解,行这呢我就直接拿过来了,大家体会一下,这里边儿这个事情好,真的是为什么要引入封装性,我们这样的一个体会先,那么具体呢,咱们这个问题怎么引入的呢?咱们是通过把一个属性私有化这个过程来来体会的。这呢,我们是通过一个animal这样个类,Animal呢,这里边有一个legs叫腿的个数的属性,这个我们在给属性赋值的时候呢,其实只有类型和这个对应类型的这个储值范围的一个限制,没有办法加其他逻辑,这时候我们说必须在方法中去这样做,同时呢,禁止用户呢,在这个类的外面直接来调属性,这呢就需要使用这个叫权限修饰符,所以我们这个引入的问题呢,是通过这样的一个情况来说明的,注意的就是这儿只是咱们说的封装性的体现之一,这只是体现之一,不要把这个情况呢,误认为或者叫等同于了我们说的封装性。
03:23
事实上呢,确实有很多同学都会,很多同学呢,都会这样的理解,这个咱们看一些书也好啊,这个这个你看一些帖子也好啊,基本上在提这个封装性的时候,都大家习惯上去拿这个私有化属性,然后提供公共的盖塞的方法来说这个封装性这个事儿啊,会让人误以为说封装性好像就是这么个点似的,但其实可不是,呃,封装性的体现呢,其实体验可以很多,这个主要呢,就是因为他设置这个权限修饰符了,通过这个权限修饰符呢,帮咱们实现这样的点。
04:01
封装性操作这个属性只是其中的体现之一,不要等同于它俩概念了,只是体现之一啊行,那下面的话呢,我们看看具体呢,都有哪些体现,那第一个体现呢,就是咱们讲的这个知识的这个体现,那就是叫诶直接我拿过来私有化。将类的属性私有化,提供公的这个方法来get和set这个属性的值啊。这个这也就是咱们刚才这个第五道问题考察的大家的这个情况,那不妨呢,我把这个呢,就粘一下CTRLC。CTRLV一下,这个是需要大家掌握的,毫无疑问,那第二个第二个体现的话呢,咱们昨天呢,也写了几个。比如说我们不对外暴露的这个私有的方法,这个类当中呢,我们会定义很多方法,有些方法的话呢,是对外暴露啊,让这个用户呢去使用的,有一些方法呢,我们自己用的,就在这个类内部自己用的,那就不对外暴露了,那我就可以生明成私有的。
05:13
私有的这儿呢也有体会,像咱们这个今天要写的这个项目二项目一,其实也是先看下项目一吧,项目一呢,咱们当时呢,说有一个叫utility这样的一个类,这个类里边呢,你看它有一些方法都是公共的,用于让咱们从键盘获取指定类型的变量,但是呢,它也有一个叫私有的方法。这个方法咱们讲的时候呢,我也没有说直接就过掉了,就是因为这个方法呢,它也不对外暴露了,他只是内部来用,我这注释呢都没有写,只是它内部人家用了,这个呢,就是当我们去这个读一个选项啊,或者读一个这个数值啊等等,它都需要要用到我们read keyboard的这样的一个方法内部使用的,所以呢,就不对外暴露了,我们讲这个项目二的话也类似。
06:09
项目二也类似,看一下项二呢,提供了一个叫cm utility,仍然是从键盘获取指定类型的这个变量的,在最后也有这样的一个方法叫private的read keyboard,这个方法的话呢,大家其实就不用去关注了,都给你写好以后,你只需要关注这些对外暴露的public的方法就可以了。这就我们所说的这个私有化方法的一个问题,另外的话呢,就是我们后边呢,会讲一个叫单利模式,单利模式呢,放到我们讲完代个关键字以后来说,这里边呢,涉及到一个问题,就是将构造器私有化了。嗯,咱们昨天呢,也讲构造器了,我将构造器私有化了,你想想会出现什么样的情况,或者导致什么样的情况,对构造器谁来造对象的,你把构造器给碎化了,意味着就外边的是不是不能随便的去掉扩造器了,外边不能掉了,咱们现在这个类呢,主要都通过对象来体现的,那你怎么办呀,是不是你就里边自己造一个呀,就是这个意思,这就叫单立,然后里边呢,我就只确定就造一个,不能再造多单,我里边就造一个,这就叫单例,就单独的一个实例。
07:29
就这个意思,就是我们在开发当中,很多时候呢,这个类呢,没有必要去造很多对象,我们造一个就够了,你翻来覆去大家都拿着这一个对称去用,就可以把这种的这个模式想法,我们归结为叫单利模式,那现在一说大家其实是可以理解的啊,只是说呢,里边涉及到一些这个没有讲过的知识,比如说static,嗯,咱们需要用到那个关键字才可以,所以放后一点去讲,但是这个事儿呢,一说大家应该是OK的。在我们这个构造器这块呢,体现的就是一个封装性,那体验四的话呢,比如我们这个类啊,这个类的话呢,我们说如果不希望。
08:07
这个类在包外被调用。那么我们也可以把这个类是不是生明成一个缺省的呀,设置为缺省的这些缺省的这个类的话呢,咱们说只能用两种来修饰,嗯,不是public呢,那就是缺省的了,对,就这个意思,行,这呢只是咱们写了其中的一些体现,实际上啊,这个体现无处不在,哪怕你写成是一个public的了,那那也那也是你不能说private,这叫封装性的体现,Public就不是了,那不对,只要是涉及到这四种权限的,那全是,那咱们写Java代码的时候呢,这四种权限基本上你是不可能不用的,所以说呢,这个封装性实际上无处不在,就是你不能说你对内隐藏了,这叫封装性,我对外暴露的呢,那同样体现了封装性,就是private的,这叫封装性的体验,Public的那也叫都算行,那核心的来点,核心的点就体现了。
09:14
咱们Java呢,规定的这四种权限。这四种权限实际上呢,你要非要说的话呢,这四种权限你可以这个等价于说叫封装性。这些呢,都只能是它的其中的一个体现而已,这个可以考虑等价为一个封装性,封装性要没有这四种权限了,那就没有所谓的封装性了。就这个意思,首先呢,涉及到四种权限呢,从小到大的一个修饰,呃,这个这个顺序啊,这个所有人都必须知道,Private缺省还得写省,然后这个怎么念。Protected protect,这是保护protected受保护的实在你要没把握了,你就说中文也行。
10:03
就是不要自己勉强自己说英文啊,说的还很诡异是吧,你就说中文也行,说私有的,缺省的,受保护的,Public的,这也OK。都能听得懂,但是你要来个pre是把这个跟他都拼一起了是吧?Pre好多都这样念哈,还得ED还都给没了啊,这个你要发音准点啊,然后具体的这个修饰的范围咱们PPT中都有,直接拿过来。咱们也考了。这个不多说,都得会。行不多说了,具体的呢,咱们来修饰,咱们在这里边也写了,说呢,这四种权益呢,都可以用来修饰属性方法构造器内部类,那其中呢,关于类呢,只能用两种,这就我们的这个说明。OK,这呢就是咱们说的这叫封装性,嗯,总结一下的话呢,其实就关于这四种权限的使用,其实是比较简单一点,就是我们把这个东西先读厚了,然后呢再给它变薄,抽取出来这个最核心的内容就可以了。接下来构造器,构造器也叫做构造方法,英文constructor啊,构造建造构造者建造者这个呢,就是这个意思,构造建造什么对象。
11:32
写到写到哪,写到这了,这构造器的作用刚才也考了,这都得会,只要我们造对象,就得用构造器。我再说一遍,只要造对象,就得用构造器,这句话自始至终都是对的。自始至终都是对的,为什么要强调这句话呢?我们后边呢,高级要讲一个技术叫做反射,反射的时候呢,我们通过另外一种方式,就是从形式上的话呢,大家看不到那个new了。
12:04
我们通常呢,这不都是通过new的方式,我写一个person后边那个你new后边这个就是构造器,叫到反射的时候呢,我们就见不到new了,就是它有另外一种这个这个第二个方法去去造的一个类的对象,形式上来讲呢,没有它了,但是你会呃,有的同学可能会误认为说是不是这个时候呢,不是掉构造器了,直接通过通过另外的方式来来造对象的,其实不是,形式上来讲你看不到你有这样的格式了,但是它里边调的还是构造器,也就是说呢,Java给我们提供这个构造器的作用啊,就是用来造对象的,也只能够用构造器来造对象。基于这样的原因,我们说一个类,它一定会有不到气,他会防着你,随时你可能会要造对象啊,是这样的一个情况,行,那具体的使用说明下边呢,我们写过这五个点。这里边刚才这不是考了这个涉及到这些点呢,大家得得清楚啊,像这个第一个说我们定一个没有显示的定义类的构造器,它会提供一个默认的,而且昨天咱们是做练习的时候吧,又提到一个情况,就是它这个构造器的话呢,这不也有权限修饰符嘛,那你说他提供的这个默认的空餐的构造器,它的权限修饰符应该是多少呢?不一定是公共的,那就看对对就看类了,比如说我们这个类呢,你要是写成一个PA,呃,Class类型的,比如说叫A类,那这时候呢,它默认提供的这个构造器呢,就长这个样子,但是如果对就缺醒的,如果大家这个类呢,生命成是个public的,这时候呢,它提供的就是一个public的,其实也很好理解,你想想我们没有写,这我给写出来了啊,你没有写它默认有,那你就是你这个,你看public,你这个类A你在哪能用,你不就能够造对象。
14:00
你这个呢,写成这样了,那就出了这个包你就用不了了,那你想出了包,你去造过造器掉扩器能掉啊,你肯定也掉不了嘛,是吧,所以也是很自然的一个事情,就是它默认的提供的这种情况呢,就是它的权限呢,这个都跟我们这个类呢是一致的,你想想我要是这样写的啊,我这个是不是意味着只在本包内有效啊,本包内有效对吧?然后呢,你说我自己定义那个勾当期,我写成这样了。你在包外能用吗?不能。是不是也不可以啊?对吧,我这是缺醒的,你这个权限大,你你说你能在外边用,我我我包着你的,我都用不了,你能用啊,对吧,所以说你这个权益你生命大了也没有意义啊,那你就跟这个类的权益一样呗,就这种啊,行这呢就是我们说的这个构造器的这几个问题,尤其是最后一个,这句话呢,我们自始至终都是对的,很多时候呢,我们说的一些话呢,前面说是对的,到后边可能就变了,像咱们当初讲的这个,比如像这个string啊,String呢,其实这个内容呢,真实的是在常量池的,没有放到堆里,但咱们画那张图呢,暂时呢都给大家先放到堆里了,然后呢,说这个对象的属性,对象的属性放在堆里,其实这句话呢,也算是对的啊,只不过有些属性呢,不完全算归到你这个对象了,就是后边要讲的带这个的这些属性,那它又放到方法去了,就是有一些内容呢,我们后边呢,会有一些变化,因为知识呢得一点点讲,但是有一些话呢,自始至终都是对的,那比如说它就是。
15:41
哪怕后边我们讲了抽象类以后,抽象类虽然不能实例化,但是呢仍然有构造器,哎,所以这句话呢,自始至终都对下一个问题啊,举例子就是说一下我们这个几个构造器,下边就写写就行,CTRLC一下就OK了,这个有的同学刚开始写这个扩大器的时候呢,一不小心呢,手一抖,这加了一个word。
16:06
这得抖了好几下,得对,这这成个方法了啊,这写完以后的话呢,也不报错,举个例子,你看这一行第一行代码,我现在呢,给他执行一下,这呢确实掉这个构造器了,掉它了,然后我这儿呢,一不小心手一抖,加了个word。上面怎么报错了呢,他说你这时候没有提供空仓的构造器了,他把你这无人城这个方法了。这个这个小心一点,刚开始写的时候呢,可能就不注意这样问题,所以我就根本没有拿这个构造器跟方法这块呢去给你讲对比,根本就不用对比,你是你我是我,就大家记各自的结构就可以了,你这样一对比呢,反而倒记住了,说啊这个记不清了,当时呃,有没是不是大家都有反馈值记不清了,都反而一对比,到时让你这个把错误的情况都记住了,嗯,这个就直接这样写啊行,这是我们说的构造器下边呢,涉及到呃属性赋值,因为构造器当中也可以去调属性这个结构,整个这个顺序咱们也考了,大家呢把它记住就可以了。
17:19
这个呢,其实你就可以看成是一个规定了,就没有所谓的因为所以了,默认的话呢,就是这样规定的,我们通过这个代码呢,只是来验证了一下人家是不是这样的一个情况,1234,到后面的话呢,咱们还会讲一个代码块,在代码块当中呢,也可以对我们这个属性赋值,到那个时候呢,我们再看把代码块呢,应该放在哪个位置。到时候呢,咱们再说中间呢,我这加了一条线,加了一个空格啊,你也可以加一条线,上边呢属于我们这个对象,初始化的时候,下边呢,是你这个对象已经出生了,后续的操作这个意思,接着后边扎病的一个概念,这个我没有考虑问题,但是大家呢,这个呢有个印象,后边的话呢,我们会用到这个所谓的这个扎病了,满足这样特征的一个类就称作一个扎病。
18:15
类是公共的,这个这个也提供了一个公共的午餐的过造器,有属性相应的盖塞的方法,哎,尤其要强调的就是这个构造系是一个无参的,是个无参的,后边呢大家就知道为什么非得无参了,这也是算给这个反射呢做一个准备,反射里边呢,我们造一个类的对象的时候呢,常常呢都是掉无参的构造器来造对象了,然后呢,使用这个盖塞的方法,给这些属性呢去赋值,后边呢你就知道为什么这样了,先知道这样一个概念就可以了。
我来说两句