00:00
好,那么刚才呢,我们是提到它的一个弊端了,那么基于这个弊端,我们就想进一步的去说,哎说呢,内存中啊,实际上呢,是有你这个man特有的这个,呃,Smoking这样属性,以及呢,这个方法也有。说如果在一些特殊场景下呢,我们想调能不能行呢。或者说你既然有,我们能不能调呢。哎,我们只说了你不能直接调用。那首先那就间接调用啊,没有间接指数啊,你得处理一下才行,怎么处理,哎,这就涉及到我们一个具体的操作,这个操作呢,称为呢叫向下转型。哎,叫做向下转型,那这个所谓的线下转型呢,其实啊,大家呢,呃,可能会觉得陌生一点啊,那如果我们跟之前的某个知识点呢,一联合啊,你会发现呢,其实也很好理解。哎,往哪回忆呢?我们前面讲过这个基本数据类型之间的自动类型提升和强制类型转换。再回忆一下我们这个复习的知识点啊,假设呢,我们这是一个int类型的一个变量,这个变量呢,是这个I啊,我把它呢,哎,赋给一个long,或者赋给一个double。
01:04
哎,我们称为呢,叫自动类型提升。哎,提升成个double了,假如这个值呢是十到这呢,就变成10.0了。那我现在呢,就需要把这个double呢,又转成int。哎,当初呢,我们叫强制类型转换。哎,你只要呢,在你那个变量前加个小框里边写上int就可以了。哎,这个呢,我们叫强制类型转化,转化成容量较小的这种啊,或者叫较低级的这种数据类型。啊好了,有了这样一个经验之后呢,诶,我们下边来说啊,所谓的向下转型。线下转型呢,下边这个呢,不能叫叫低级的或者叫容量小的属于类型了,而就是子类啊。说呢,我现在把这个子类这个对象呢,哎,你可以呢,直接就声明成子类student s等于new一个student。但现在呢,我把你此类的对象呢,声明成是诶负类的这个类型了。其实就是多肽。啊,其实就是多肽了,好,那这个多肽呢,哎,就是往上这样的一个过程,那现在呢,你把这个student呢,赋给成一个person了,那我现在呢,就想让他。
02:05
啊,声明成是一个student怎么办呢?哎,这个我们叫做向下转型,其实呢,就还是用一个小括号。小号里边写明你想转的类型,那在这个问题中就是student。哎,这呢,我们称为它叫向下转型,因为习惯上我把负类呢写上面啊,所以这就向下了,那么对应的这个词呢,叫向上,向上其实就是多肽。哎,就说清楚了,好,那么回过来啊,这块我们来说一下这个问题啊,呃,这个问题的话,那个代码可能稍微多了点,咱们去新建一个啊。这个位置呢,我写成叫a person。哎,它的TEST1啊,他。好,那么刚才这个呢,相当于是向上转型,就是多肽这个呢,我们来说这个向下转型啊,它的这个问题啊。好,那现在我们先在营造一个多彩的场景啊,我这呢,就你一个慢了啊。啊,这呢是一个P了,哎,刚才咱们也说了,你通过这P1呢,试图啊去调用你这个啊慢里边特有的这个方法呢,是不行的。
03:02
啊,比如说这个啊,Earn money。啊,回过来看这个呢,是掉不了的啊,包括呢,我们打印一下这个P点叫is smoking。哎,这个难看都不靠谱啊,所以这个调不了。哎,不能直接调用啊。哎,调用子类特有的这个结构啊。好,怎么就能掉呢,那下面我就说了啊,必须呢做一个向下转型。哎,怎么转呢,你就把这个P1往这一放,哎,我们想生命成是一个慢。哎,那这块我们就写成一个叫M1了,哎,这块呢,直接就加个慢就可以了,诶这就完事了啊。哎,转移完以后的话呢,我们此时呢,哎,就是一个慢类型的了。那么这个M1的话呢,我们再去调它的这个is smoking就可以了,哎,先调arman嘛。哎,Earn money就可以了,然后I呢,去调这个is smoking,只要权限允许就能掉。来,我们走一下。
04:02
哎,你看这时候是没问题的啊。哎,注意这个时候的我们这个P1和这个M1,它俩呢,指向的是不是同一个对空间中的对象。诶,是的啊,这个呢,我们想证明的也很简单,你直接呢,PE等等于M1是不是就可以了。哎,对,咱们这呢,是不是讲质传力的时候也提过一个变量存的就是地址值嘛,是吧?哎,那这块我们比的是不是就是他们俩的地址了。好,我们去转一下啊。你看这个呢,就是个触嘛,哎说明呢,它俩的地址是一样的,DG呢,就是哎这个P1和咱们的M1呢,指向哎堆空间中的。哎,同一个对象。哎,既然你指向同一个对象了,哎为什么不能调呢?哎主要原因就是因为你的这个哎生命的类型不一样了,哎我们只需要把这个类型呢强转一下呢就可以了,这个线下转型呢,其实就是哎使用强转服是吧。诶,这样就可以了。好,那么这个强转的话呢,我们就说到这儿了,那么再回忆一下,咱们前面呢在讲这个。
05:03
强制类型转化的时候呢,提到过可能会导致精度损失是吧。就是你上边呢,可能是这个10.1,这个你转成int呢,就变成十了,这不就损失个点一嘛,哎,这呢也算是它的一个问题吧,啊,那你说我们这个向下转型的时候,可能会出现一些问题嘛。啊,不可能吗?呃,也会的哈,哎,我们说呢,向下转型。哎,可能会出现什么问题呢。啊,你看一下啊,我现在这个呢,是不是你的一个男人是吧。哎,或者咱们再换一个场景也行啊,哎,我这呢叫P2,哎,我们扭了一个。吴门是吧?这是个女人是吧?哎,你看到这个人的话呢,哎。这个我这是一个是一个女人啊,如果有的女人看着呢,这个头发一剪,感觉像是个男生一样,是吧,你就想给他。啊,强占成是一个男人是吧。
06:00
M2,哎,这个呢,你看需要旋转好,那我就慢一下了,你看我报错了。但你肯定知道这个事儿不太靠谱吧?啊,人家是个女生,然后你咔强转成个男人了。啊,那这时候呢,呃,下边你就你说要调这个方法的话呢,说这个抽根烟是吧是吧,或者这个挣点钱是吧,调的话也能调哈,但是呢,根本就没这个功能。内存中也没加载过这个方法。啊,你要是去执行,这不就挂了吗。诶,这个在第30行。30行这是吧,强转的时候呢,出错了,你看这个错误信息。叫做class cast exception。哎,我们称为它叫类型转换的一个异常。诶所以这块呢,我们说诶线上转移可能会出现什么呢?诶出现这个诶类型转换异常。啊,说白了就是根本不是这个类型的,你非要给他转,这不就出错了。但是对于变音器来讲呢,它不会报错哈。也就是说我们编译的时候没事儿,运行的时候才出错的。
07:01
看能不能理解哈,因为呢,对于变音器来讲,你这这个负类。呃,你要想象下转型转呗。你要想转,你转成什么类型,你告诉我你写上行可以转,所以语法上的没问题。但是呢,真正我们在运行的时候呢,你发现呢,不太对,不是个男的。啊,这个是吧,不是啊,所以不行。哎,那这呢就报错了,哎这呢只能是把它注释掉。啊,那我们怎么能够保证说这个程序呢,健壮性一点,避免出现这个问题呢。哎,这块我们就引入了一个哎关键字啊,说呢建议。啊在啊这个向下转型之前啊。对,使用啊,叫instance of啊。进行判断。啊,然后呢,呃,进行判断目的是什么呢,就是避免。出现这个class cast exception。
08:00
哎,那你怎么就能好使呢?来来看我说一下这个原理啊,比如说呢,拿着我们刚才说的这个例子。哎,你上来呢,就把这个二呢,就转换成是个男人了,发现不靠谱是吧?哎,那怎么办呢,我先P2呢,叫instance of,我看一下你是不是个男人。这个咋看的呢?这个你就不用想了是吧。啊,就是判断一下是,哎你这个P2呢,哎,是不是一个慢,如果要是是它就会返回是个处,只要是个处那我就可以转。哎,那我就跟你强转了。哎慢哎这个P2,哎,那强制完以后呢,自然而然的你就可以呢,去调这个方法了。哎,我们只是在刚才这个操作呢,这两行之前呢,加了一个判断而已啊,那这时候我们再去做这个RA,你发现呢,它就没有在抛异常。因为根本就没进去。啊,所以这个呢,关键词怎么去使用呢?哎,我们在这儿说一下啊,这个如果我们看成是第一个点,然后看这个第二个点啊这个怎么用呢,它这个格式呢,是这样子。
09:01
哎,前面呢,是一个变量啊,或者说呢,是一个对象,哎叫因此。Instance这个词还记得吧?实例或者说呢,也可以叫对象啊of呢。就是谁的。啊,诶后边这块呢,注意是个类型。它的意思呢,就是哎,判断对象小A是否是哎类A的实例。所以说它的结果是个波形啊。嗯,其实这个关键字呢,我觉得挺简单的,但是每次讲到这儿的时候呢,总有好多同学呢,就有点儿懵啊。你看为啥简单呢,这就是实力的意思,就是对象的意思是吧,说你这个小A啊,你这个对象是不是恶物不就得吗。是不是我们这个A这个类型的一个对象。所以呢,左边这呢是一个对象啊为代表的这个变量了,右边呢是一个类是一个类型。哎,就看你是不是,哎就这样个情况,是那就是出,不是那就是错。
10:01
但是这时候你说是不是怎么判断呢?你看我这P2是个类型,你别看左边啊。你看你实打实的这个实体是谁?象对象主要指的是右边这个实体是吧,那你看那个实体的是个woman OK,那就这是个慢,那就不行,那就进不去啊,哎,那你换而言之,呃,我们P2呢叫啊instance of,我就写个woman。啊,那这个肯定就能进去。反正进去你愿意强转也行,或者我这块我就简单的哎,在这写一句话哈,哎,我就写一个叫哎,Woman。哎,他那肯定是能够打印的啊。这不就进去了吗?那既然能进去这块你该强转,那肯定是没问题的啊。哎,这个大家注意好,那那么由这个出发呢,我们再呃写这样的一个场景哈,嗯,这样啊,什么意思呢说呃,如果啊。哎,如果呢,A啊,这个看大家能不能理解啊,如果A呢,叫instance of这个大A,哎,如果它呢,返回处。
11:00
这是一个大前提啊。哎,则。则什么呢?我说这个啊,则A。啊,因此。Instance of,哎,我这我这样写吧,叫A。啊,返回也是出。哎,这里边的一个条件啊,说其中是吧。其中你说我这个A和CA是什么关系啊。子父类的关系,谁是子类?AA是子类啊来说这其中A呢,它呢,诶是这个叫a super a的子类哈。哎,就相当于这个意思啊,说你这个小A,你是不是个男人呢?如果说是,那我说这个小A他一定是个人。哎,就这样啊好,那就是如果你这个语句要能进去的话呢,我说呢,只要我把这个woman呢,换成是这个,诶换成是这个woman的负类全都能进去。哎,比如说P2呢,叫in of个person。是吧,我说能进去我再来个if p2呢叫instance of这个object。
12:03
是不是可以进去。对的啊。C。啊,CTRLCTRLV这个我们就改成啊,比如叫person。啊object啊,然后我们来一下。诶,你看这时候就全都能进去啊,没有问题啊好,这个呢,就是咱们关于in的一个使用的说明哈,呃,结论是什么呢?结论就是大家呢,如果在开发当中需要啊向下转型了,就是我就现在要想调用调用我这个具体的这个,呃,你造的这个对象实体的这个特有的属性和方法了,那你就向下转型,但是向下转型呢,注意在转之前一定要用ino呢,去操作一下,判断一下是不是能转,能转再转。啊,这样保证我们这个程序呢,有一个健壮性啊,这就是对应它的一个使用啊,我呢把这个核心的代码呢,写到这儿了啊它CTRLC。哎,咱们拿过来。这样啊。诶对应到这儿好避免呢,出现类型转换的异常,使得我们这个程序呢,更具备健壮性。
13:01
就可以了啊好,那么这块的话,我们关于多态性,其实呢,这块主要讲了两个大的问题啊,呃,一个呢叫做哎向上转型,其实就是多肽,呃一个呢叫做哎向下转型啊,就是这个强转啊,强转之前呢,用in色判断一下,然后向上转型呢叫多肽了,我们知道呢,哎它呢有的前提啊,技能性方案的重写啊,具体的应用场景,大家呢,你就可以拿我们这个animal呢来举例。啊,去体会一下就可以了。啊,那么呃,问到说,你是如何理解泌向学样的多态性的?该怎么去说,想一想,哎,当我们讲到这章的复习的时候啊,我们讲我们债法就复习,诶你想想这个继能性多态性怎么去说的高大上一些。OK啊行好,那么关于多肽这个内容的话呢,咱们就算是告一段落了啊,然后呢,接下来的话呢,我们看一看多肽的课后的练习题啊,对应的有这样的四个练习题,然后包括还有这个企业的面试真题,好首先来看第一道题。
14:00
说这里边呢,提到了这样几个类哈,第一个呢,叫做几何图形类啊,用这个就ma来表示的,呃,它对应的这个子类呢,叫circle啊,还有一个呢叫myangle是吧,这个叫句型啊。哎,然后对应的写这个测试,诶相应的这个关系图呢,这块也给我们提示出来了,哎,首先呢,咱们就写这个福类啊,来写它OK啊这块我们就右键新建一个Java object。啊,这个单词呢,不太好写啊,这个慢点写啊,这个metric,然后object啊。好,这个完了以后呢,在这内部呢,声明了两个成变量啊,这个井号呢,表示叫受保护的啊,诶protected这样的一个权限啊好string类型的叫color啊protected,然后double类型的叫weight,这个weight呢,表示叫权重的意思。OK啊好,然后接下来的话呢,提供一个构造器,这个构造器呢,对这两个属性呢,做初始化,这呢也是一个protect权限的,直接咱们就生成了啊al加insert。啊,直接我们找这个构造器,针对这两个属性呢,都做初始化,哎这呢,我们改成叫a protected。
15:06
OK啊行,这个呢都比较简单一些,然后呢,针对我们这个属性呢,提供概率方法,同样我们自动生成。OK,好,然后有一个求面积的方法啊,就是这个方法了,因为呢,我们说这个几何图形,它只要是一个封闭的几何图形,它都有这个对应的面积了。哎,Public返回值呢,是个double类型。啊,然后呢,叫find艾啊。哎,这样啊,好,那么大家想一下啊,对于一个普通的几何图形求面积,你说这个我们怎么写。这个没法写是吧,哎,因为咱们说你要是个圆呢,是个矩形啊,哎,都有相应的求面积的这种公式哈,哎,如果是一个完全不规则的一个图形,这个球面积的话,还是。比较费劲的是吧。嗯,这个呢,暂且的话,咱们好像也写不出来啥,所以呢,我就先return一个,先来个0.0吧。哎,这样子啊,这个闲聊两句啊,你要对一个普通的这种几何图形,它可能也不太规则是吧。
16:03
这块比如说随便这样整一个了啊,你说这个求面积怎么怎么弄。这不太好弄是吧,对这个呢,你要是诶用这个对像讲过微积分的话呢,有一种计算方式哈,诶比如说这个呢之外,这这咱就闲聊的呢哈。比如这块呢,我们能够把这个图形呢给它啊,如果你看成是两个函数的这种拟合的话呢,那就好办了是吧?上面这个呢,如果是FX啊,下边这个你称为呢,比如说叫GX是吧?然后这个呢,它的起点呢,假设叫A啊,这个终止点呢,假设叫B啊,那这个就很好算了,从A到B这个范围内的就是FX。减去这个GX,然后呢,求个积分就可以了是吧?对这呢是一个通用的公式啊,那这呢依赖于前提呢,就是你恰好呢,是两个函数非常明确的一个拟合了啊,然后呢,他们在这有个焦点,在这有个交点,那如果要是就是不规则的这种图形的。是吧,就是这块,因为我们像刚才写的这种,有有有这种叫凸的这种几何图形一样,是吧,你像这种要是极其这种不规则的这个,这这咋整。
17:05
加个眼镜是吧,嗯,行。呃,要纯不规则的话呢,这个就不太好弄了是吧,微积分就不太好使了哈,这个呢,其实有很多种方法,比如统计当中有这种蒙特卡罗的,这种叫投针法是吧?比如这块的话,你可以给他画一个矩形假设哈,这个矩形有个范围从零到A,比如从零到B是吧。这个也不一定非得是零了啊,你可以放到这个圆点上,然后呢,这块呢,你比如说你随意的给他投上,嗯,比如说11个点。啊,11个点的话呢,你这个这个矩形的面积是很好求的,然后呢,你看多少点落在这个范围内是吧?呃,落在范围内呢,占这个的比重是多少,这不是外边的面积好求,乘以这个比重就可以了是吧。呃,这也是一种方式啊,方法有很多哈,呃,当然这个咱们就先聊了一下啊呃,目前的话呢,由于没有呃统一的一个图形的一个样式,所以我们没有办法去求它的面积,所以暂且呢,我们就先写成这个样子了啊。好,然后呢,我们再回来看一下它的这个子类啊,子类第一个我们先写一下,这个叫S啊。
18:03
C呢,作为它的一个子类啊。首先呢,我们让他呢去extend啊,这个只有metric几何图形好,写完以后呢,马上就报错了,这个咱们前面有过类似的这个场景,原因呢,是因为。对。构造器的事儿是吧,对啊,咱们在这个负类构造器当中,我就显示了写了一个带参的啊,这个子类呢,呃,由于没有生命构造器,诶默认呢就是空三,哎空三呢,手上呢又默认S泊空啊,由于负雷里又没有虚泊空,哎,所以呢,就导致我们这块就哎一上来就报错了啊。好,这个的话我们先忽略它啊,直接按照这个要求呢,我们先往上写着,呃,这呢首先private。Double类型的readers啊,这个就是半径。哎,半径啊,OK,好,接着的话呢,提供一个构造器啊,那既然提供构造器了,那我们就显示的调用负类中带参的那个构造器,好你看这块我们怎么写啊,Alt加insert选构造器,诶然后在构造器里边呢,针对于咱们当前的这个半径呢,也做了数字化,所以呢,这块选中它,然后点OK。
19:10
你看它自动的就给我们调了福类中代餐那个啊,因为也没得选哈,就这一个啊好这个呢,就是我们说的这个构造器的一个生成。然后呢,改善方法。哎,找到这儿啊,针对于半径,哎,没问题啊好,接着呢,Find area这求面积相当于呢,对负类中的方法做一个重写啊,这块的话,你直接找到负类方法也行,或者说呢,我们直接在这个此类里边,我就写上叫find。他这呢也会给我提示啊,我一回车,诶,其实现在就在做over red做这个重启,诶默认的话呢,跟负类这个方法你看是一样的哈,就直接在return负类这个方法了,哎,那对于咱们来讲,圆的面积咱就直接来去计算了。3.14乘以。哎,Readers是吧,哎,再乘以一个,哎,Readers。哎,你把它呢,换成叫get readers也可以啊。
20:00
也行。好,这个呢是重写的方法,那这个呢就完事了啊回过来接着再看另外一个词类。哎,这哥们儿啊。诶,在这个右键一个Java class啊,MY。Re,是吧,这样啊?好诶首先的话呢,让他呢也是去继承于咱们的几何图形啊,这个别忘了啊,诶同样的这个构造器的问题,咱们先接着往下写private double类型的啊。Wise是吧?Private。哎,大波型的叫he,诶这样就可以了啊嗯,这个呢,我们叫宽啊,哎,这个可以叫做高啊好,接着呢,我们提供这一个构造器,Alt加insert,哎构造器,哎把这两个属性呢都初始化一下啊,OK,行。这个呢也比较清晰啊啊,接着呢,提供了一个属性的概算方法。啊,像这个呢,这都是套路啊。OK。好,然后再接着呢,去重写我们这个find这个方法。Find area这样是吧,好,然后这块我们就直接return一下啊呃,对于这个。
21:06
几个中心来对这个矩形来讲呢,直接就是宽乘以高就行了。诶,这样就OK了啊。好,那么这样的话呢,咱们这个类呢,就也设计完成了啊,接着的话呢,这块提到一个我们写一个测试类啊,就就matric test在这里边呢,要写两个方法,这两个方法呢,涉及到参数,这个参数呢我们使用的是负类。哎,在这块呢,我们去体现这个多态性。OK啊,所以呢,你看到我们这个多态性营养体现呢,首先呢,得有这种类的技能关系啊,包括呢,我们提供了这个方法的重写,这个都是一些前提的条件。好,接下来我们去创建这个啊,这个metric test。在这啊,在这里边呢,具体要完成的功能,诶,把这两个CTRLC啊粘过来,诶我们不妨呢就放在这儿了。来先写第一个啊,用呢编写一个叫equals area方法,测试两个对象的面积是否相等。
22:00
啊,那就是这个场景了,首先public是否相等返回,这是波尔类型,这个方法名叫equals area。就它啊,好,那么我们要比较的是几何图形的面积是否相等,那你最起码得有俩。对去比哈,那首先呢,调用这个方法的这个对象呢,是这个magic test跟几何图形没关系。啊没关系,所以说这时候呢,你所谓的两个几何图形呢,我们就通过行参来去体现了。哎,这个呢,叫只有。这metric object是吧,这个我们比如叫一,这是一个啊,Metric object,这个叫G。诶,所以这里边儿呢,要比较面积是否相等的,就它搁脸了。啊,是否相等,这个咱们就直接return了是吧,哎,这1.find对area这个用。等等吧。嗯,And area这个不是说可以了,应该说只能用等等是吧。哎,为啥这么讲呢?因为你也没别的选它反过来是一个double是吧。
23:02
哎,可能有同学会想,诶那equals,诶equals注意它是一个方法,前提呢,你得是一个引用类型的才能点是吧。你看这个double的话呢,这基本数据类型是不是这块你也点不出来,我们说想要的那个所谓的ES是吧。你看他也没有啊。啊,因为你是个基本熟悉型啊,所以这块我们就等等。OK啊好,等咱们讲到这个,诶下边这不有一个叫object嘛,诶到这个里边呢,我们会专门的说一下这个E的方法,以后呢,咱们再用的话呢,就诶都清楚了啊,现在呢,用的时候呢,总感觉还有点儿藏着掖着的一样啊。好,这个我们再拉回来,这时候呢,就是比较一下两个啊几何图形的面积呢,是否相等啊,我们可以写这样一个注释信息啊。呃,比较两个。哎,几何?嗯,图形的面积。是否相等诶就可以了啊,然后这里边这个这件二呢,就是我们这两个几个图形,我我我就省略了啊return呢,就返回是否相等了,哎,如果是处哎这个呢就表示啊面积相等。
24:08
放肆。诶,这就是面积不相等。OK啊好,这个呢,我们就写到这儿,然后呢,接下来说编写一个方法叫display啊,这个me object说显示对象的面积啊,相当于我们在这个方法里边调用一下这个几何图形求面积的方法了啊,它既然上显示了,那咱就直接就不返回了。Display metric object。啊,这块的话呢,呃,有同学呢,可能这个英语稍微的弱一点是吧,你看哇,这么长的一个方法是吧,以后的话呢,大家还会见到更长的啊对慢慢来啊,就现在呢,遇到一个呢,你就稍微熟悉一下就行,Display呢叫显示啊。是吧,显示啊,显示一下你这个几何图形。就这意思,这个呢,就是几何几何的意思了。啊,代数几何是几何啊,这个metric啊。
25:00
在这呢,就表示一个图形啊,一个物体这样啊。好,那么你具体要显示的是哪一个几何图形呢?呃,这个肯定不是你这个调用者了,它跟几鹅图形没关系,就纯是个测试类啊,所以呢,诶,我们得有一个参数了。哎,这个我们比如就要这个G了,哎就它啊好,那么在这里边呢,我们就直接打印是吧?哎,几何图形的面积为,诶这个呢,直接调一下我们这个叫find area就可以了。好,这呢,我们就把这个方法呢,就也写完了啊,这个呢叫按显示。嗯。显示几何图形的面积。好,这就可以了啊好可以完以后的话呢,我们直接呢,在当前这个测试类里边呢,我们就开始去调用这两个方法了啊好,那么要想调这两个方法的话呢,首先得有当前类的对象。所以呢,首先呃,我们把这个测试类的个对象呢,创建出来啊,然后的话呢,我们要想去调啊,比如说咱们先来个显示吧,显示的话呢,这块你需要传一个几何图形。啊,没有没有没有,咱们就这我就不用匿名对象了啊,直接呢给大家造出来一个,比如来一个圆,诶circle c1啊,你有一个circle,这里边呢,我们需要传这个参数了啊这呢还给我们提出来了啊说string形的color,比如red啊,权重啊1.0啊,半径啊2.3,诶这我就写好了。
26:19
行,这个大家可能对于这个权重呢,没什么概念是吧,这个呢,就是在图形化界面的时候呢,我们考虑这个事儿,现在呢,就只是作为一个属性,你了解一下就行啊。好,然后接下来的话呢,你可以再去创建一个,比如我孩子要一个,哎。远吧。啊,这个呢,诶你改改也行是吧,比如改成这个3.3。这样啊好,那么这两个创建好以后呢,这叫显示几何图形的面积啊,这你写个C1,哎,复制一份来个C2。哎,我说呀,在这个位置呢,其实就体现了我们的多态性。你看我们调研的方法时呢,它声明是一个几何图形,哎,这呢是声明的一个类型。哎,但是呢,当你真正赋值的时候,哎,我们给他呢,实际上是拗了一个具体的圆,哎,我以C1为例啊,就这样子了,所以呢,你会看到啊说呢,呃,声明的时候呢,是个负类的引用,但是实际上赋值的时候呢,是一个此类的实例。
27:13
哎,这呢,就构成了我们典型的叫此类对象的多态性。哎,咱们前面提到过啊,多带性啊,这个我们泛泛理解呢,就要多种形态啊。哎,什么叫多种形态呢?说我这需要个起塑形,结果呢,你给我整过来一个圆,哎,整过来一个矩形都可以。多种形态。OK啊好,那么当我们真正去调用这个泛式方法的时候,我按住CTRL键编译的时候呢,认为你这个方法呢,是父类中声明的。啊是这样的,没问题啊,这让我写的是0.0,但是呢,当我们真正运行的时候,哎,我们执行的是你子类,哎重写负类的这个方法。哎,所以这个时候呢,你看我们去调用它就不会是0.0。哎,这呢,就按照我们具体的这个几何图形,它的这个,呃,3.14乘以半径的平方来算出来的。
28:04
那这呢,就我们叫虚方法调用,哎,或者叫虚拟方法调用。这样啊。其实这块呢,还有一个词儿。啊,还有一个词儿啊,怎么称为呢?呃,称为呢,叫动态绑定。啊,我在这写一下啊,这个呢,大家做一个了解就行啊,叫做动态绑定。啊哎,有动态绑定了,大家可能有点迷糊啊,我再给你,呃,对应的一个是不是叫静态绑定啊。哎,我一说呢,大家能明白哈,什么叫静态绑定呢?就是说我们编译的时候说我调的是这个方法,然后运营的时候你调的还是这个方法,相当于你编译和运行指的是同一个方法,这就是显然就是静态了。就意味着我编译的时候呢,是谁动态这个运营的时候没有变,这不就是始终是不动的是吧,诶我们就称为叫静态绑定,而这种呢,编译的时候呢是A方法,运营的时候呢是另外一个方法。
29:01
哎,这就是动态的,相当于编译和运行时候呢,对应的是不一个方法,不是一个方法,那就称为叫动态绑定了。感谢我们后边呢讲的,后边要讲的啊谁呀,比如说这种静态的方法。哎,后边咱们第八章是吧,一上来会讲啊,像这种静态的方法呢,就是你编译是谁运行就是谁。啊,因为静态方法呀,它没有重写之说。哎,因为它不能重写了,所以说我编译时候是谁,你运营的时候呢,那不就是它吗?啊,这种叫静态的啊,而咱们现在写的这种方法呢,是可能被重写了,所以就会导致编译的时候跟运行的时候呢,指的不是一个,这种就叫做动态绑定啊。就是一个词而已啊,哎,我这样一说,大家也能基本上明白就行了,不用去深究啊。好,那么这个呢,是我们关于这个方法的一个调用啊,接着我们再来啊,通过这个test呢,点它有一个叫equals。啊,在这里边儿呢,我们就可以把呃两个呃几何图形呢就放进去了,返回的就是一个布尔类型的啊一个结果。
30:07
哎,布尔类型的是吧,叫is,比如叫equals。哎,这么着是吧,哎,然后这块你可以做一个判断啊,啊EZ和四,如果它要是个处啊直接呢,这就是个处了,说那你说诶面积相等。哎,否则else。哎,这个,哎面积。哎,不相的。OK啊啊,这个呢,也比较简单一些。哎,直接呢,你看这俩不一样是吧,就不相等了啊好,这个呢,我没有拿这个几何图形,呃这个呃句型呢去测试啊,这个大家你再拿句型测一下这个这都可以啊,这比较简单,比如说这块我们再稍微的呃演示一下这个匿名对象的一个情况啊,比如你通过test点我们调这个叫display,这时候直接去new一个呢叫Mary tle啊,这个也OK啊。对应的这个参数,比如说不录啊,逗号权重啊,1.0。
31:00
然后这个宽高是吧,一个2.3啊,一个4.5这就行了啊好,这里边呢,就计算一下它的这个面积,这个呢,仍然是满足我们刚才说这种多态的场景,第二呢,你几何图形的啊,Find area的这个方法。OK啊。好,这个呢,咱们就使用的相当于是叫匿名对象了啊。哎,因为这个对象呢,我说我后边我也不用了,我就用这一次,哎,所以我就写成个匿名的方式了。OK啊。哎,再让我们写一下叫使用匿名啊对象是吧。好,这个呢,就是咱们对应的这个第一道题了啊。这个就属于咱们比较典型的这个多肽的场景,主要呢,就在诶这个这个位置去体现的。啊这块啊,然后呢,在里边呢,我们就呃调用了这种负类的这个方法,在运行的时候呢,是子类重写的典型的多肽的场景。OK啊,没问题。好,这个呢,咱们就过了啊。好,接着来看这个第二道题啊。呃,这个呢是这样说的啊,说呢,修改一下我们写的这个包下的apply啊,这应用下边的我们写这个animal了啊说这个判断一下这个animal呢,呃,是dog还是cat啊,如果是它们的时候呢,我们在向下转型来调用各自特有的方法。
32:15
哎,这样一个情况,这个呢,相当于我们来演示一下这个线下转型的一个使用了,诶我把这个,呃,这个源代码啊,哎,我CTRLV。原文件呢,我就粘过来了。呃,他是这个意思啊,咱们在这个测试里边呢,写了一个方法啊,参数呢是animal。啊是animal啊好,然后呢,在这个编写的时候呢,我们只知道你是个animal,所以呢,我们在这里边调的时候呢,也只能调你父类声明里边的这个方法。这个咱们都很清楚哈,这就咱所谓的叫编译,看左边啊。呃,那么在这里边,你显然呢,去让它这个看门啊等等,这都不靠谱啊,这个这个他也你不知道它是狗还是猫,诶所以这块你强行的让它去钓呢,首先animal也没这个方法也调不了,哎你要想调的话呢,咱们说呢,那你必须得做强转。
33:04
那就是所谓的animal呢?得转成是一个狗啊。对是一个do啊,这呢旋转这样的一个格式,旋转完以后的话呢,这个do呢,你倒是能调这个它特有的方法了。啊,但是这个问题呢,在于。不一定是狗是吧?啊,对的啊,所以呢,我们在这调的时候呢,第一个这个调啊new dog没问题啊,当然我把它给逐掉,我们只看这个事儿啊,我再去调这个new cat的时候呢,就报错了啊。诶叫class。哎,因为我们在这个这个位置,哎,调用了这个方法,这个方法里边呢,又调了我们这个do的这个方法,诶在这块呢,挂掉了。啊,这个原因呢,大家其实也很好理解啊,这就不行啊,呃,那么要想能够啊不出异常这样呢,我们说呢,在强转之前呢,为了保证这个程序的健壮性。价格判断是吧。哎,你先判断一下你animal是否是一个狗。
34:02
哎,如果是返回是处,你在调。哎,这样就可以了。那如果要是个猫呢?是吧,哎。这时候你写个l if也行,或者我直接呢,就写成个if也可以哈。Animal instance of。啊,这个呢,叫K是吧。哎,你要是个猫的话呢,我就给你转成是个猫。An animal。然后呢,那拿着它呢,猫是有一个抓老鼠的一个功能,哎,这不就可以了。那其他的也没有,那这也不用写else啥的啊,哎,或者你把这个呢,直接这个调到这个下边,把这个else去掉,嗯也行。哎,这都可以啊。好,那这样的话呢,我们再去调这个方法的时候,那由于呢,你也不是一个狗,所以这个没进去,诶人家是个猫,那这个就进去了。最后呢,就诶能抓老鼠了,就。哎,你看这没问题是吧?诶上面这个也是,诶我们把它打开啊,行,这块呢,大家你要想debug一下的话呢,也OK,诶稍微的咱们呃,这个渐进式的熟悉熟悉这个debug啊好,那我现在呢,比较关心的就是这个方法的一个调用过程,好现在我就在这个位置呢,点上鼠标左键啊,加上一个红点了啊呃,加上红点以后呢,我们右键一下这个叫debug,或者呢,你在这块呢,诶这个左键一下,这个呢叫debug都可以啊,或者你在这块呢,这不也有一个吗?
35:22
好的位置都有是吧。这块有没有。这块点的话呢,直接就当那个run了,就。啊,现在就没起作用啊,类似于我们这儿呢,直接点的第一个啊。嗯,OK,那以后呢,大家这个写程序的时候呢,建议呢,你就点下边这个bug啊。因为呢,你要是没有断点的时候呢,你点它跟点上面这个run其实是一样的。是吧,效果一样啊,但是你要有断点的时候呢,这不就能够帮你去做调试吗。OK啊好,这个出来了,出来以后呢,现在就诶这个程序就到这儿了,注意这一行代码还没执行上面这个执行了,所以呢,你会看到呢,在当前我们这个程序里边呢,一个有这个参数叫X啊,另外呢,就是我们造的这个T的这样一个对象是吧。
36:03
啊,就有它俩了,好,现在这个代码呢,停留在这儿啊,要执行了,我们这时候的执行呢,我比较关心的是这个它里边的这个内容了,所以我们点这个呢就不行了。哎,点第一个的意思呢,他就直接走下一行,你看一下啊,我一点它相当于上一行代码就执行完事了。这就完事了啊,那我现在就想看,咱就以下边这为例啊,我想看这个方法里边是怎么执行的,你点这个的后一个叫step into。诶,有同学会发现呢,后边这个也叫into,前面加了一个叫force。Step into。就强制进入是吧。啊对,这两个的区别的话呢,其实就涉及到我们要是看一些源码的时候呢,呃,你点这个呢,默认进不去啊,这个点源码就能进去啊,现在是咱自己写的方法,其实这两个呢都可以啊,我就点前一个了啊一点,哎这不这时候呢就放到这儿了啊,因为此时咱们想创建的是一个。诶在这儿是吧,我想创建的是一个这个这个猫的对象了是吧。
37:03
你看这块我我不知道这个断点去哪了,你点前面这个啊,点一下它现在在这儿呢,啊好,这个呢,你走下一步,这其实呢是帮我们创建这个对象,因为我不是没显示的写构造器吗。所以他刚才呢,就显示到这个类的声明这块了。因为我没写构造器,不要写构造器的话呢,直接就定位到那个构造器那儿了啊。好,这会儿我再点它是不是就回来了。好,然后接着我再去看一下内部的源码,这不就蹦到就刚才呢,其实他想看源码呢,是蹦到我们这个构造器这儿了,然后接着回来以后呢,这不就蹦到我们这个方法这了吗。哎,到这了啊,现在呢,我们这边就调这个一的方法,这的没啥可看的啊,咱就直接走下一步了,这这也没啥看的,哎,再就往下看了,好,下边这块就判断说断你这animal啊,是不是个狗,咱们知道造来是个猫,所以你看这块已经显示出来是fo了啊,诶再往下走。这就走到这儿了吗?哎,说你是个猫吗?你看这其实已经能看到是个出了是吧,哎,然后呢,接着往下走,这不就进去了,进去以后的话呢,说我就强转了,哎,强转以后呢,这就诶抓老鼠了。
38:04
然后再往下执行。呃,再往下执行,是不是这个方法就执行结束了啊,接着呢,就没方法回到这儿来了,再走,这不就结束了吗。哎,就是整个这样一个过程啊。行,这个呢,就是我们所谓的叫debug,呃,尤其在什么时候我们比较好用呢,就是这个程序呢,不像刚才这样报异常了啊,就那会儿啊,我们没加in报异常了,报异常的时候呢,直接你看哪一行直接定位就行,有的时候呢,我们这程序呢,没有报错哈,但是运行的结果呢,不是我们想要的啊,这个时候你就需要呢,一点点这样去走一下看看在整个呃过程当中。啊,是不是有问题啊。好,这个呢,是咱们说的这道题,这个就没啥了啊,主要呢,是演示一下这个向下转型的事儿。然后接下来啊,我们这儿还有一个这个题目三。这个练习三的话呢,它是这样的啊,他给了一段现成的代码,呃,涉及到了有这种类的集成关系啊,也有这个方法的一个重写,OK啊,呃,要求呢,让我们去建立一个叫instance test这样类,定一个method,里边呢放的是person啊,我们所谓的类啊,然后在这里边呢,呃,有相应的一些操作,主要呢就让我们写这个类和这个方法的啊,上面这代码已经给好了,那咱们就直接拿过来用。
39:18
直接拿过来用,那我这样吧,写到一个文件里得了,现在把这个文件呢,我们创建出来。哎,这样是吧。好,那么这个文件里呢,我就呃,放着好几个类了。哎,咱们说一句啊,实际上在开发的时候呢,一般的一个文件里边,咱们就放一个类的。啊,一个文件里放一个类,这里呢,只不过咱们练习的这块呢,就诶。就我就放在这一块了啊,实际开发的时候,你看这实际上我们一个文件里边目前就放了四个类啊,这个在实际开发的时候呢,你想如果我们这个包首先很多,然后包里边呢,目前呈现出来的,其实正常来讲,你要是就有一个类的话呢,它就是诶按这个类名来呈现出来的,要一个文件里边有好几个类,它上面呢说啊我这是个文件。
40:03
会这样啊,呃方便呢,我们以后调的话呢,其实你就是一个里边就放一个啊,会更方便看一些啊,权限呢,你该小你就还小呗,比如这个circle,你该让它是呃缺域性权限,那你就把它去了就完了。不受任何影响的啊。好,嗯,这块呢,既然都这么说了,那咱就。改改呗,是吧。咱们平时练习的时候呢,有的时候呢,是为了呃,让大家能够方便看出来,说这就是独立一道一道题啊,所以说就放在一起了啊,你要单独拿出来,那就单独的,那现在呢,我这写完之后报错了,这为啥呀?对,往这看一下是吧,哎,Duplicate,这叫重复的。哎,对啊,我们在同一个包里边呢,是不能声明同名的类的啊,要不区分不出来了,哎这块呢,因为我们不是重名了吗。哎,所以呢,你把这个呢,代码我们先给他拿过来是吧,粘到这儿了,然后把这个person呢,咱就给它干掉呗。
41:00
哎,这就可以了啊好,接着呢,Student。C啊,哎,回到我们的这个位置啊,咱就这样了啊,到这CTRLC。我就从这儿到这儿啊。这样就可以了,把这个学生呢,给他干掉。好。不是说把学生真的干掉啊。删掉啊好,然后到这儿CTRLC。在这呢啊。哎,这样。诶,这样就行了。好没问题啊,这时候呢,我每一个文件里边实际上就只放了一个类了,你看这时候看着要更舒服一点,比这种要好一点啊,你看。好,然后呢,我们来看一下具体这个类他让我们干什么啊,这个就是下边这样一个说明啊,CTRLC翻过来啊,咱们不妨就放到这儿吧。嗯,往前拽一拽啊。这么着?
42:03
啊,这个我们看看怎么做啊。嗯,这样说的说呢,在这里边儿呢,你定一个方法叫method,参数呢叫person,呃,目前也没说返回值的事儿,那咱就先写成word了。Public VO method参数person是吧啊。好,那么这里边看一下说它根据E的类型来调用相应类的get infer方法啊,因为呢,每一个类里边的get in for呢,都相应的有些重写了啊,信息呢不一样。说根据它的类型去调相应类的get in,这个怎么整怎么整。也就应该得判断是吧,比如说E呢,叫instance of怎么写?先写小的得是吧,你要上来呢,就写是个person,这个呢,你想声明都是个person,那你这还判断是不是person类型,这肯定是。所以这个是不是一定能进去。对啊,所以你要先写它再写,比如这个else if e写student,这个就不太。
43:08
合适了,是不是下边就肯定进不去了。对,咱们以前讲过啊,说呢,你把这种范围小的跟范围大的俩写一起的时候呢,要把它写上面啊。OK啊,所以这块你要写的话,应该先写这个是吧。来谢谢他啊,然后再是student。啊else,其实也就他们仨,我就else了。或者你说L1一下,诶后边else不,这个else不写了也行。啊。啊,这是我们叫一个person啊行。然后呢,这里边儿干什么事儿呢。哎,说呢,根据你是相应的这个类型的,我们去调它各自这个类的get方法,这里边怎么写。需要强转吗?啊。需要强转的,这个呢,有一点不清楚啊,我这直接要写概率符的话呢,是不是自动有一个虚拟方法调用了。
44:03
你是哪个类的,不自然就掉你那个类的这个方法了吗。对吧,所以不用强转啊,强转都不用了,你甚至说呢,我们这个判断你觉得有必要吗。对,我说呀,判断都没必要,你上来我就直接叫1.getin,你是哪个类的,你自然而然的不就掉那个类的get in了吗?对吧,哎,所以这个事儿呢,其实我们根本都不用写啊。说了半天不用写啊。直接调就完了啊,哎,这个呢,我们直接打印一下啊,因为它那返回的是个字符串啊。没问题,行,你看这个事儿咱们先停一停,现在呢就来做这个验证了啊。所以呢,通过这个练习呢,咱们不断的去巩固这个知识点啊,建议呢,而不是什么呢,我先把这个理论弄得透透的啦,然后我再开始做练习。啊,理论你要整的透透的话呢,这个花的时间是很长的哈,呃,基本上咱们现在的这个知识点,诶觉得也还行啊,基本上也能听得懂,朦朦胧胧,但是似乎呢,又又又懂一些。
45:04
就跟那个喝酒喝的那个微醺的状态一样是吧,其实这种感觉呢,是最好的啊。呃,平时不敢说的话呢,也敢说了。啊,但是呢,又不至于完全丧失理性是吧。嗯,这时候呢,就是写代码的时候呢,实际上是最舒服的,你想完全对这个对代码,对这个理论清醒。很难,这个得花好多时间。是吧,就是就跟咱们以前那个,不管是从书上学的一些知识也好,还是从那个父母那块获取的一些知识也好。你这个总想证明他是对的,或者他是不对的啊,或者你虽然他说的是对,但是你就不想按照他说的那个走啊。就是因为你没有实践嘛,纯粹的给你挂理论的不愿意接受。那当你真正实践以后呢,你才发现,诶,原来说的很多话是有道理的是吧,所以当我们当成父母以后呢,我们也这样的说,有孩子呢也这样不理解他,最后还得自己实践,就翻来覆去的一直这样循环是吧。所以这块呢,就是你要想对这个理论有彻底透彻的理解,没有实践呢,是很难达到的啊,那就是当你基本清楚以后呢,就去操作,哎操作过程当中呢,你去想,哎哟,这个为什么报错了呢?哎,你看哦,原来某个知点这块是这样说的是吧,或者说哎这个为什么这样呢?啊,原来知识点是这样的,哎相辅相成的啊。
46:19
好,这块咱们再回来。所以呢,这个位置的话呢,咱们就没有必要呢,你去呃,指明它是哪个类型,再去调改进符了,直接上来就调啊,这就是虚放调用了,好那么测试一下啊,通过它点来咱们调这个method。我们此时比如说就knew一个叫student。啊,这个,诶没参数是吧。啊,这边没有任何参数啊,这个属性的这个信息你看都已经都写上了啊。好,那么回过来,回过来以后的话呢,我们看一下它掉的是不是这个学生的里边这个钙粉。哎,其实你能看到啊,其实就是。诶怎么看呢,Person里边呢,就俩属性,打印这俩属性,诶student的话呢,多了一个属性,打印仨属性。
47:03
这个呢,呃,又继承了多了一个属性,它打印四个属性值。那现在你是仨,显然呢,就是学生的。啊,主要原因呢,就是因为你new这块呢,就是new的一个学生。所以自然而然就知道它的类型啊,接着。这个完了以后啊说呢,根据E的类型啊执行,所以如果你这个E呢,是个person啊,就输出它是一个student呢,输出俩是一个graduate输出。这个怎么整?啊,这块是不是该判断了。对的啊,哎,这个我们判断这个就按照我们刚才说的那个事儿啊,首先。是吧?这呢,输出的是三个信息。啊,就这三个哈,哎,CTRLC。啊,这是一个啊,然后三个。一个是a student,一个是a person。来看一眼啊。诶,没问题,好,然后呢,接下来如果你要是个学生,输入俩输入一个行,接着呢就else if是吧,E of student。
48:07
哎,他输出一下这俩。这么着啊,然后剩下这块呢,你肯定是个person了啊,这个或者你写上else if也行,我这就写上else了啊,就光打印一个他。啊,因为这个E呢,本身这边一定是个person是吧。这样写没问题吧?好,这块我用的是一个student啊,此时呢,我们去run一下。哎,那这个结果呢,就是先呢掉盖符,然后呢,因为你是学生嘛,把这俩打出来。OK的是吧。那这个就这样写了哈。呃,然后呢,有一个小的优化哈,就是这个位置的话呢,其实还可以再换一种方式写。诶,因为你会发现呢,就是呃,这里边看有一些重复性的一些信息了啊,所以呢,呃,如果你把它看成是一个冗余的话呢,诶可以考虑呢,稍微优化一下怎么着呢?哎,还是先判断啊E。
49:00
叫of。在这里边儿呢,我就只写这一个啊。哎,对的啊。对这个想法的话呢,大家诶。也有啊,就是我们写这个LC if这阵叫多选一,哎,我呢直接写成好几个啊一。啊,这个叫student。这个呢,我也就写写这一句。诶类似的你也知道了啊。当然下边这个判断呢,其实也没啥意义了啊,那他肯定是个person。哎,这样也行。哎,当你要就是一个graduate的话呢,第一个进去了,第二个也进去了,第三个也进去了,是不是三个就都输出了。你要是个学生啊,这这个没进去直接呢,这个和这个进去了是吧,所以效果一样啊。嗯,没问题啊,还是他。哎,这样就行啊。好,这个呢,就是从咱们这个编写的角度来讲呢,稍微的啊优化了一点,执行上来讲呢,其实没什么变化。
50:01
呃,或者说执行上来讲的话呢,还不如上边儿这个的是吧,上面这个的话,你比如我们第一个没进去,第二进去了,我们把这个输出直接就跳出了,而这个的话呢,它会几个都会执行。啊,当然这个小细节呢,差这一点点的话,对于CPU来讲呢,基本上都能忽略了啊。行,这道题呢,就完事了。啊,结束啊,然后接下来我们来看这个下一道题。啊,这道题啊,这道题稍微的看着长一点啊。啊,一个一个来啊,首先声明一个类叫人,呃,在这里边儿呢,有两个方法啊,因为咱们现在是练多肽的啊,多肽这块呢,其实跟属性没关系啊,所以你看这个题目当中其实都没属性的事儿啊。好,首先呢,去写这个类CTRLC。啊,其实大家呢,写作以后你发现这个题啊,其实就套路差不多啊,只是呢,在不同的场景下呢,我们去体现这个多态性了。好,这里边儿呢,有俩方法。
51:01
啊,这个呢叫E的方法。嗯,这个我们说人。哎,吃饭啊。哎,这个呢,是去厕所的啊。哎,这个,哎上。人啊,去厕所呢,感觉。没有这个高大上呀,上洗手间是吧?这个老外的话呢,有的更更含蓄,是说I want I want to somewhere是吧。Somewhere somewhere就是含蓄点说我我想去去去去某个地儿是吧,有的呢,这个中国人就听不懂,就你想去哪,嗯。嗯。好,然后回来啊,这个呢叫慢啊。哎,慢的话呢,这个是男人。这个男人的话呢。这个没说是吧。哎,这写重写了,那肯定是得继承了啊,哎,让娜娜去extend一下,哎,Person啊。
52:00
好,切成以后,接下来说重写上面的方法,然后呢,另外多加一个方法,先重写吧。把父类的这两个方法CTRLC。那这块我们粘过来啊。啊,第一个吃饭啊。这个,哎,男人,比如这个。大口的吃饭吧。啊,这样啊,这个呢。嗯,站着去厕所啊。行不是,这是怪怪的,应该不是站着去,嗯。这个男人,去南侧吧,这样啊。不是本来都站着去,女生也不是不站着去是吧?啊,去男厕所啊。嗯,行这个这样啊,哎,然后呢,再多一个方法啊,说这个抽烟是吧。嗯,这个叫什么,嗯。
53:01
侧后一支烟是吧,嗯,行这样啊。哎,完事了啊,然后接着啊,这个woman是CTRLC。哎,新建一个啊woman,然后呢,Extend这个person是这样啊。好,就是这个person的话呢,如果我们别的包下看也有,呃,在你这块呢,去继承的时候,那它会给你提示是哪一个,呃这块你发现呢,我看都没看,我直接就回车了哈,因为他优先会选择当前包夹。所以一般第一个就是哈。诶,第一个不是啊。Person person我一回车啊,他刚才这个你看不准是吧,你看person看这不就第一个吗。还是第一个得是吧,就是你直接呢就写就行,它默认就是当前这个是优先选择的啊。好,然后呢,对person里边这俩方法呢,也得重写。
54:02
这两个啊,CTRLC。CTRLV是这个呢。呃,这个哎女,哎女人是吧。那就比如说这个小口的吃饭了。这个去刚才男是怎么去的啊,去男厕所是吧。那这个就好写了是吧,哎,女人去啊,女厕所是吧。好,这个呢,我们就完事了啊,然后呢,多一个方法。嗯,男人呢,这叫侧后一支烟是吧?行哎。最后补补妆是吧。哎,行,哎这样啊。然后回过来啊,这就完事了,那接着呢,有一个测试类啊叫它,那我们就新建一个类。哎,测试啊。这里边儿呢,对应的方法,呃,已经提示给我们了,就写它。
55:01
写这个啊,这个看看怎么设计说呢,在该方法当中说每一个人啊,注意为什么叫每一个人呢。哎,可变行参哈,所以这呢,其实你想象的话呢,这是个数组啊,是多个person。哎,这个呢,你可以理解成就是我们这个数素名一样了啊,哎,每一个人呢,就先吃饭,然后上洗手间,然后呢,如果是男人抽根烟,女人不个状。哎,就这个意思啊好,所以回过来以后呢,这块呢,注意啊,这个之前我看有同学写的时候呢,上来就点呃掉这个吃饭了,所以怎么调不了呢,说这么person吗。啊,有的人说没创建类的。是因为那个原因吗?啊,你说没有,他意思就是没有赋值哈。那肯定不是,因为呢,咱们调理方法的时候呢,那时候付的十餐是吧。对的啊,这个原因是因为。因为啥?对,刚才说了啊,你这相当于是个数组。
56:00
是吧,你速度点你点你能点你烂死。没了是吧,哎,这你数组啊,哎,数组的元素啊,比如我们这样写一下哈,你是可以点it的是吧。对,这个一定要注意哈,所以就别一看说,诶这不person吗?不是哈,还有点点点呢。啊小心,诶所以说这呢是可能有多个person的,所以呢,每个人诶,那你这块得放一下啊。里边这个写法呢,跟我们调数组是一样的啊。然后在这里边呢,嗯,你就先呃调psi是吧,点他先吃饭。嗯,吃饭间隙呢,去一个厕所啊,Toilet是吧?然后的话呢,接着就得判断了啊说如果哎,你这个psi呢,叫S是一个男人。为什么每次都得先写男人呢?如果你是女人啊,先写女人。哎,我们呢,就先。强转是吧。对这个呢,你别判断是是你说强转都不用了,这个还是得写的啊,嗯,是一个woman是吧。
57:02
好这么着,诶忘了这块得强转一下啊。哎,这么着了,好,然后这块呢,你要试的话呢,我们就调它的一个叫补妆。啊,没卡是吧。哎,这是它了,然后在l if。哎,直接呢叫in of是一个慢啊。哎,这么着,然后呢,这是男人。然后呢,哎是吧,这样啊好是男人的话呢,这个呢,就抽根烟啊。哎,这是我们这道题的一个点啊。这就完事了是吧,下边呢,就具体的这个测试的事儿了啊好回过来这块,我们在这儿写一个具体的测试啊,没方法。好,那么这个方法比大家会发现我前面呢加了一个叫斯static是吧。这个呢,我们还没有讲,那咱们暂且呢先把它去掉,去掉以后的话呢,这个方法要想掉呢,我们得通过当前的对象。诶后边呢,咱们讲这个死在这个以后呢,哎,你会发现呢,这个方法呢,其实直接在main里边去调也行啊。
58:06
暂且没有讲,所以呢,我们要想调这种啊,非静态的方法,就得通过对象来调啊。好,那么这呢,我们就eer点啊,调这个meeting,我们就可以传好几个了啊,就传一个男人啊,传一个女人啊,再传一个男人啊,我都写成匿名了啊,三个对象往这一放啊,数组的长度就是三啊,依次呢去执行这个for。来一下。哎,这就我们看到整个的结果啊,稍微有点长,哎,或者我们在这个位置,咱们出了for循环啊,我在这块我整诶不能出了for循环了,在放在这个位置啊执行完。这个14I的时候呢,我们换一下行啊,稍微的能够。清晰一些啊,哎,这个呢,就是第一个啊,这个男人。哎,他的这个事儿啊。哎,这个呢,是他特有的这个方法了,啊啊这呢是这个女人的哎。
59:00
补补妆是吧?哎,这又是这个男人的这样。行,没啥问题吧。嗯,OK啊行,现在就咱们说的这个多肽的这种场景。哎,体会一下啊。好嗯,这块呢,稍微的比如我们再说两句哈,比如这个呢叫是个类型的哈,这个呢,我们就判断它是否是后边这个类类型的。啊呃,刚才呢,你看我提到一个小点哈,说呢你这个instance of这个woman,哎,如果呢,是一个处肯定是能进去了是吧。肯定能进去呢,还得做个强转,你会发现呢,要能进去呢,下一步操作你肯定是强转了吧。这个基本上是没跑是吧,所以呢,你看我这么着一下啊,我写个W。我把这呢一住,我这儿呢也来个W,你发现哎哟这也可以。哎,这儿呢,是新特性。啊,这个你要是用的JDK8的这个版本呢,这个就报错了啊。呃,这个呢,咱们讲到最后一章的时候呢,给大家呢,系统性的过一下GT8,呃,余下的一些新特性以知呢,一直到JDK17是吧,这些的新特性都有哪些,这儿呢是其中的一个,呃,应该是在好像是12还是13的时候啊,因为后边他每半年一份,这个有时候你都。
60:17
就不是那么清晰了,是吧?哎,这个有这么一个新特性哈,哎,这个新特性是什么意思啊,就像我刚才说的哈,这这块你要判断他是个男人了,下边你马上要做的一定是强转。哎,所以这个没跑没跑,既然如此的话呢,就给优化了一下啊,就相当于把这两行给你合成一行。因为呢,我们强调以后呢,往往还要用这个名嘛,所以干脆你把这个名就写后边得了,所以呢,你要是一个女人啊,是的,同时呢,我就给你起个名儿,下边你直接拿这个变量名就用就行。啊,那现在呢,大家可能还不熟,不熟的话,咱们就诶先还按原来这个方式来啊。后边慢慢的我们再说,你先呢,清楚一下应该是什么意思是吧,后边呢,我们再说这个优化的事儿,这是一个点啊,顺便的话呢,借着这个题目呢,我们再唠叨两句哈,你看我那个的I这呢是它的一个类型,是一个person类型的哈。
61:10
诶,我现在让他叫的时候呢。我后边这块能写什么哈。首先,我目前写的是person的子类。我呢,也可以写负类。这你看这都不会报错的。哎,你对的话,是的话处你就执行,不是你就别进去了是吧,这是一种场景,这都不会报错啊,但是你看我要这样写啊,哎,PI,哎,小括号啊PSI。后边呢,我叫我随便整一个类哈。你看。编译都没过。说他是不是一个走场,你不是你就放呗,不行编译我就不让你过,这个理解一下为啥呢。对啊。就是我们这个变量是吧,这个变量呢,有个类型。啊,有个类型好,然后呢,呃,我们通常要判断呢,你是不是这个类型的,是不是因此呢,我就是是不是某一个类型的,那么你这块呢,一定都是拿着他的,诶person基于他的啊,你考虑它的父类也好,父类的父类也好,诶它的子类也好,子类的子类也好,我们就在假设这是person啊。
62:19
我们这有个变量叫E,呃,在它的这个上下呢,你用S都是没问题的,如果现在有一个类呢,这个类跟它没有任何的关系。你想想判断的话呢,他也不可能是出。啊,那时候其实编译器呢,就判断了你这个string啊,跟person没有任何关系哈,编译都过不了。哎,这个小细节呢,大家注意一下就行啊,我一说呢,应该就明白了啊,这个编译都不通过。上面这个呢,都编译就是只要是跟person呢子符类相关的啊,编译呢,都能通过运行呢,那就看真正是出还是false了啊。好,那么这道题咱们就说到这儿了,接着的话呢,看一看多肽这块的两个。这个笔试的真题啊,首先我们来看第一道题。
63:03
就往往这种笔试题里边呢,大家你得小心一点啊,这种首先啊,大家整体把握两个点,第一个笔试里边这种题啊,我们可能在开发当中都很少写的。啊,所以说这块呢,它不具备代表性。那第二点的话呢,他既然呢在笔试里边考了,那一般都有坑啊,所以你处理的时候呢,一定要小心一点。小心加小心是吧,OK啊。好,那我们看一看这道题,这呢是这样子的,说呢,有个负类,有一个属性啊,有一个方法打印这个值。比较简单啊,这个为了方便看啊,我这呢把它。听一下啊。啊,有一个子类。这个此类的话呢,诶跟它定义了一个同名的属性,咱们以前也说过了不要这样做。啊,但是笔试题嘛啊,就会给你出点极端的情况啊,然后呢,对这个display呢,还进行了一个重写哈,它也叫count。啊,方法存在覆盖之说,这是你读到这的时候呢,要强化的一个概念,然后属性没有覆盖之说。
64:06
好,接着。哎,题目来了啊。好,我们就来看这个题了。嗯,这边啊说呢这个哎,New一个sub new了一个这个子类的对象,哎,让s.count一下,问这个值是几,是多少。20注意啊,就是属性这块呢,我们说了没有多态性,那你声明的是什么类型,我呢打印的就是你这个,呃,类型这里边儿这个属性了,因为呢,你这块呢,显示的是sub,所以呢,我打印的就是你这个对象里边的诶子类的这个。实际上呢,在内存当中它有俩是吧。对的啊,好,接着s.display。那一定是这个了,这点count是不是它,所以这呢也是20。好,接着呢,我把这个S呢付给了这个B,这不就多肽吗。那文本B跟S的地址一样吗?哎,这个一定是一样的。他没有不一样的道理啊,因为他俩指向的不都是他吗?
65:02
哎,所以呢,地址就一样啊好,那么b.count呢。哎,B点康。哎,对,这时候呢,注意是十了。咱们讲多大性的时候呢,关于属性这块呢,叫编译和运行都看左边是吧,所以你就看贝就行哈,哎,这个就就是十了。哎,还是这个意思啊,这个B呢,指向的这个对象在内存中堆空间中有几个属性啊。还是有俩是吧,对,只不过呢,就是你掉的是谁,你就看左边这个类型就行好b.display。这块有难度了啊b.display b呢,我们是看成是base了,Display我现在一点是不是认为呢,就是。负类里边这个了。哎,谁让你声明的是类呢,这就我们所谓的叫编译,看左边啊,但是你是方法呀。运行得看右边了,右边你是sub,所以呢,就是这个了。这个难以打印,是不是20啊。哎,所以这块呢,哎,先不看下边这个啊,看上边这块感觉会有点儿意思,什么意思啊,呃,你明明呢,你俩的地址一样哈。
66:08
明明你俩地址一样,言外之意就指向了是同一个对象,哎,但是呢,表现出来的还有区别,就是你们在调属性的时候,你发现竟然不同哈。要方法是同一个,但是属性呢,你发现还不一样。诶,这个呢,就是咱们多肽的一个,它的一个特点啊。好,这是上边的,然后我们接着看下边这个呢,那就比较简单了,直接呢,我声明是base new也是base,那就是你自己的啊,你再调这个count呢,那就是使呗,Display呢。肯定是十是吧,都没有子类的事儿啊,哎,这个没问题,好,我们run一下。嗯,看一下啊,二十二十负十二十啊,哎没问题,哎,咱们做的是对的啊好这个呢,就是我们说的这道题,在这里边呢,大家要强化一个点,就是属性不存在多态性。就是方法啊。好,接着来看下一道题。呃,这个题的话呢,其实啊,比较有意思的是这个啊,他问我们说多肽呢,是一个编译式行为还是一个运营式行为啊。
67:08
对,你首先得看得懂这道问题啊,就是说多肽的这种表现的这种特性,我们也可以泛泛说呢,叫多种形态嘛。哎,在我们这个Java这里边儿这个多肽呢,咱们目前讲的就是此类对象的多态性。就是你声明的是一个负类。比如说你看。我我看哪儿呢。这看这个不太好看了啊,咱画到前面这个题目里边。啊,就以咱们刚才写的这个题目里边,像这个person一样啊说呢,我们这传的是一个person,现在像那个数组一样了,啊说呢,我们看到的是一个一个的person了。但实际上呢,你这块呃,传的这个值呢,其实是一个一个的子类的对象了,这叫多态性哈,它这种多态的这种特性呢,他就问你是在编译的时候里确定下来,还是运营手段才确定下来的。对,这个注意其实就是运行嘛。对,因为咱们编译的时候呢,就认为你是声明的那个类型,也就是负类类型。
68:04
只有运行的时候呢,才知道你真正加载进来的是一个哪个子类了。啊,那如果让你证明的话呢,这呢,咱们就我我写了一个比较讨巧的一个做法啊来你看是这个意思,这个animal一个方法,Cat dog啊羊是吧,哎这个呢,都是子类,然后重写这个方法了,然后呢,你看这个位置。嗯,看这个位置哈,呃说呢,我们呃要get一个incens调离方法,调离方法的话呢,想返回一个animal的一个对象。那如果说呢,呃,你把它看成是一个编译式行为,那杨爱珍呢,就是这个代码往这一放,你就知道呢,实际上它返回的是哪一个animal。但其实呢,这个你根本确定不了。因为我这儿呢,根据这个K呢,决定你到底造的是一个什么。这个K的话呢,我是取的这个随机数嘛。这个随机数呢是哎,我特意呢又写了另外的一种方式啊,前面呢,我们随机数呢,用的都是这个叫M。
69:02
假如random这个方法是吧,通过它呢,去配出来任意范围的一个随机数,除了这之外呢,其实还有一个类,这个类呢,就叫做random。这个类名就是它啊,它呢也有一个方法叫next,这呢写一个值,这个值呢,我写的是三,这个叫棒呢,就是边界是三,它的意思呢,就是取值呢,是从零开始到这个边界,但是呢不包含这个边界。哎,所以这个里边就是012是吧。呃,因为不包括边界啊,从零开始的,所以呢,这个位置呢,我们就会得到一个零二啊这仨里边的任意一个值了,哎,这个值呢,你可以打印看一眼啊,然后把这个值呢放到我们这个里边,根据你这个值是零一还是其他的这个二是吧,哎,我们造的对象呢就不一样。哎,就说明呢,就是哎,我们其实是运行的时候呢,才能确定到底你想。造的是哪个对象?啊,像以后呢,咱们讲这个web开发也是一样啊,那这呢是咱们这个后台了啊,这呢是用户的这个前端。
70:02
简单说一句哈,那用户呢,有好多的这种请求的行为。啊,比如说简单来说呢,用户可能要登录,他可能要注册,咱们就以这两个为例哈,你也不知道他是想登录,他还是想注册。总之是最后呢,我们都要调它的一个啊,比如说一个具体的处理业务逻辑的一个方法啊嗯,这个咱们其实假这个这个请求呢,其实又分成概率请求,破损请求,诶就简单了啊,诶假设让大家理解呢,就是一个盖的请求了。好,那用户呢,他现在有个请求过来了,我现在呢,要调的就是get这个方法。这条改的方法,但问题是你是请这个叫什么注册的?Get方法呀,还是要登录的get方法呀。这个是不是就不确定了。诶,那怎么办呢,那我这儿呢,根据你注册还是登录啊,哎,你们都看成我就简单写哈,假设你这个类呢叫A,这个类呢叫B,我呢提供一个A或者是B这个类的负类。
71:00
假设这个负类叫C,我现在就调这个C点钙的方法。啊,我就叫C点干房,我就这样写,当然你我我我不知道你到底是A还是B好,那么当用户点击的是一个注册行为的时候呢,他就发过来一个。注册的一个,其实他还不是一个具体对象了,他就只发一个标识就行,比如这个标识呢,就是诶我这是A啊,他就发个标识就行,发过来之后呢,我们这个后台呢,根据他发来这个标识,咱们创建一个。A的对象,我就拗一个A的对象了。那么你用完这个对象呢,假设叫小A,呃,其实这块你看到的是C去掉的,其实实际负的值是不是就是小A啊。诶,然后我去调盖的方法,这不是实际执行的,就是你注册的这个盖的请求了是吧?哎,那你要这块想登录呢,好,你就直接给我发个标签就行,假如这个标签呢,就叫B发给我后台以后呢,后台一看,哎哟,你发的是个B这个标签行,我就给你拗一个。哎,B的对象。诶,这假设叫小B了,这个小B这个对象呢,其实不就实际上就付给你这个C的这个变量了,或者你直接用个B付给C也行啊,诶我们去调这个get的方法,那就说明编译的时候,你看似呢,还是这个父类的这个调的方法,实际执行的时候呢,你传过来的是具体子类的对象,而且调的是子类重写的方法。
72:17
这不就是多肽吗?哎,就这样场景,那你说对于后台来讲,他一开始调了get,他哪知道是谁呀。哎,那就得看你传谁,我就造谁的对象,这不只有运行的时候,这是我们后台呢,始终执行着呢,啊,24小时不间断的去执行的。根据用户传过来的什么行为,我们这就造哪个对象,所以这块呢,都是运行时候的才能确定你到底呃是哪个对象,编译时候是确定不了的啊。哎,这个注意。行,简单的体会一下。好,那么这样的话呢,咱们关于多肽这块呢,就彻底的就告一段落了,呃,大家呢,再捋捋啊,多肽我们一直强调的这个问题啊,然后我们复习的时候呢,再总结一下,呃,你是怎么理解多态性的。
我来说两句