00:00
那笔试题完以后呢,后边这有一个代码题,这个题呢也不是特别困难,这个咱们就来一起看一看,那首先呢,这里边说定一个接口叫compare object,那我们这样的话呢,就定一个。这是咱们一个练习题,哎,我就新建一个包,这个呢叫一个三。新建一个这个接口了,你看从这呢也能看到我们类和接口是并列的概念,我就直接写一个interface了,CTRLV一下,Finish就这个样子行,然后在这里边呢,它定义了一个所谓的叫抽象方法,CTRLC一下。行这呢我就放到这了,这里边这个抽象方法的话呢,基本上都给你写好了,我们就直接拿回来用就行啊,CTRLC一下粘过来,行这呢就相当于就写完了,就那抽象方法你会发现呢,这怎么抽象方法还有一个解释说明呢,抽象方法不都是抽象吗?这还解释啥呀。
01:00
对,需要去解释的就是,虽然呢,咱们这个方法呢,我没有方法体了,但是我这个方法呢,是要干什么的,我这个反位值是什么意思,这个还是明确的,只是说呢里边呢,你比较的这个逻辑呢,会有点不同了,这个咱们就不管了,比如说呢,回头你这块比呢是一个person,那你可能比的就是person的属性,然后呢,返回值是正的负的零是什么意思,这个其实最初在接口中就已经定义好了。只是说呢,你这个对象呢,是person,可能是customer,可能user等等,那你这里边儿呢,不同的对象的属性呢,大家不一样,所以呢,在我们这个接口层面来看,我没法具体具体指明,所以我才给抽象化了,诶就是这个方法做什么用的,其实一开始呢就定义好了的,这也是咱们说的接口是定义一种规范,我虽然呢没有写这个方法体,但是这个规范呢是已经定义好的,就是当你反回是零,代表呢,调这个方法的对象和这个形态呢是相等的,如果是正数表示调这个方法的这个当前对象大啊,负数呢就是当前对象小,行就这个逻辑,然后接下来说定一个circle声明这个半径,然后盖菜方法行,这块呢,我们去新建一个色口。
02:17
这样,那这块我们就添加private double类型的,呃,这个radius上面大家写错了啊半径,然后呢,提供盖的方法,诶勾选一下OK,然后构造器,构造器的话呢,你可以提供一个空餐的,提供一个代餐的。行,这呢关于这个类呢,我们就创建完成搞定,然后在下边在下面的说定一个叫comparable circle,让它呢继承circle,同时呢实现这个接口,先把这个类呢我们造出来。Compar行,然后呢,按照这个要求CC。
03:04
好,首先呢,提到说这个comparable circle呢,去extend咱们的circle,同时implements,咱们这个comp,这个object compar object这个别导错了,自己这个包下的,然后呢,说在这个comparable,这个circle当中,给出接口中compar度这个方法的这个实验体,然后比较两个圆的半径的大小,就是这个呢,是咱们以前造的一个circle的对象,现在呢,说我们这个,呃,它的一个子类叫可比较大小的一个circle,说圆呢,可以用来比较大小了,这是造了一个专门的子类。那首先呢,我们提到这个接口中的抽样方法,我们需要做一个重写,行这块呢,我们就去重写了。这个重写的逻辑呢,其实跟咱们原来说的那个equals呢,稍微有点接近了,诶就是咱们前面说过的啊,说equals在哪用呢?在还后边呢,咱们可以比较对象的大小,其实还不是说这块,这块呢只是说用了一个这个事儿后边咱们讲到集合的时候,诶到时候再提比较大小的事儿,那在这里边咱们呢,说去比较大小你也可以呢,上来先直接判断一下也行,嗯,当前这个Z是不是跟这个O是这个这个同一个引用啊,同位引用的话呢,这时候就别具体比了,直接return一个零。
04:19
表示相等呗。嗯,就这个意思了,好,那如果说你俩不是同个引用了,我们这时候就得看这个它俩的半径最大伸小了。但是前提呢,你得先把这个O是不是得做个强转啊,先if,如果O叫instance of,你得首先试一个,嗯,这个是吧,先得试我们这样的一个圆,那你要是试的话。是的话呢,我现在就可以比较大小了,嗯,先对先做一个强转。这呢,我们把这个O呢就扔进来相转了,旋转完以后,我们当前对象呢有一个半径,它呢也有个半径,比较它俩半径谁大谁小,你看能不能这样写呢,我直接呢叫Z点这个这个readus呢,我们直接得get了get readus,然后呢,我直接让他去减去c.get readus,这样合适吧。
05:17
这两个是double类型的,我们现在需要的是个int型,那这时候呢,我们得需要做一个强转,你别你别改这个,这个咱们后边呢,基本上都是用in的啊,人家都已经写好了,你这块呢,说你这块有问题,你把人家接口给改了,这也不合适啊,得改你自己的代码,那这块呢,我们就这样写了一下,如果你要是不是。这个这个当前这个类的,就像呢,咱们下边再接着去考虑,剩下这个逻辑啊,那先看先看这个事儿这样写。有问题吧?没问题啊,就是稍微差点意思,比如咱们这个半径呢,是2.3,我这个是2.1。是不是就成零了,这这就提到了我们这个强转的话呢,这不会精度损失吗?对,所以这样呢,其实是差点意思,不不太合适,或者我直接写个叫错误的,这个不合适了,有漏洞,那正确的写法怎么写?
06:18
那就是你要大的话呢,我就返回一个正数,你要大我就返回个负数,那这是不是就自己去写if了,哎,this.get readus,然后如果你要是大于c.get一个readus,你要是这个大的话呢,我就给你return,只要是正数就行,不妨就写个一了,Else if,如果this.get一个readus,然后小于c.get一个readus。我就不妨return一个负一得了,然后再二次呢,说你俩相等,我就RETURN0,这样可以吧,对这呢是一个正确的一个操作,那这是一个正确的行这呢我们就这样来写,然后呢,如果你要根本也不是一个comparable circle,那直接我这是不是就相当于类型都不一样了哈,类型不一样的话呢,人家这块还要求你去这个这个返回一个int性值怎么办啊对这我们目前的话呢,也只能是考虑得return一个东西,那没有别的可选的,我们只能先写个RETURN0。
07:18
只能先写个RETURN0,那咱们明天的话呢,来讲这个异常,那讲异常的话呢,其实我们这块呢,可以呢,让他去抛出一个异常类的对象,对今天呢,我写这个呢,大家可能还看不懂,明天呢就懂了,这个呢我们叫呃可以说呢叫传入的,传入的这个数据类型不匹配。嗯嗯,这样,你看我这呢,抛出来一个异常的对象,这块呢,你看也就不报错了。就是相当于他这个类似于呢,就是替代了我们这个RETURN0这样一个操作一样,这个呢,咱们这个这个明天才会去讲啊,暂时呢,这个没讲过,没讲过呢,大家暂时呢,你先return个零,诶先这样去处理啊,后边的话呢,就是我们再考虑用这个肉的方式表示呢,就是你传这个对象的类型啊,不合适就不用让他再去return了,就。
08:14
行,那这样的话呢,我们把这个compare to这个方法呢就写好了,那关于构造器这块,构造器呢,咱们给他提供一个代餐的吧,哎,我就public这个提供一个构造器。嗯,这个。这里边来一个哎,Double一个readers,那这里边直接呢,咱们就super来一个readers。保存一下。行这个逻辑呢,我们就这样处理了,那接下来呢,咱们做一个测试。测试这个呢,我们是关于这个,我写了一个叫comparable circle,这个还挺长啊。
09:06
对吧。好在这呢,我们去测试一下,首先呢,我们得创建两个comp搜它这个对象了。Comparable circle,这个叫C啊,你一个。嗯,这个C,然后alt斜杠comparable circle,这呢,我们附一个值3.4,这给一个,然后再来一个。3.6行,然后呢,此时咱们c1.2,我去调了一个叫compare to方法,把这个C2呢扔进去这样一个情况,然后呢,这会我们就返回了一个具体的数值,那这个int型的一个叫compare吧。Compare value可以这样,然后呢,咱们就可以诶。诶可以呢,下边进行一个判断了,说呢,如果咱们这个叫compare value,它呢是一个大于零的。
10:05
这个呢,你可以在这里边写一个,写一句话啊,叫C1这个对象大,Else if comparable value小于零,C2这个对象大。哎,这样子两个对象呢,一样大。量大行这个逻辑呢,我们就写好了,那现在我要去执行这个数呢,是不是应该就是一个负的呀,我是拿这个C1COMPARE的C2,就是它是相当于咱们说那个所谓的Z4当前对象了,哎,这呢就是这个C2这样大,那这就没问题了啊,那如果说一开始咱们这个没写正确了,咱们一不小心呢,写成这个错误的这个情况了啊,写成这个情况了,那现在的话我要去比。
11:05
数据认为它俩一样大了,对,所以这个呢就稍微差点意思了就行,那这呢是一个错误的情况,这呢是一个正确的。这个正确的,那么这个正确的除了这样写之外呢,还有没有别的方式可以考虑呢?其实也有。其实也有,那这块呢,我们可以再给它变一变,怎么变呢,这个变的话呢,要再说那就只能是回到咱们circleq这块来谈了,这样处理这个radius呢,咱们暂暂时呢,用的是一个基本数据类型,我在这个基础上直接改了就啊这个,因为咱们这个操作呢,变动没有那么大,我就不再去重新复制一份了,我改成一个double,是一个包装类,这是包装类了,我这也都改成包装类。可以了是吧,我现在是用的包装类,然后呢,咱们这个子类的话呢,继承的时候呢,因为你拿过来的其实也是个包装类了,包装类的话呢,其实它里边就会有一些方法了,所以我把它呢就注入掉,注入掉我呢此时这次点get一个radius,你看我得到的是不是一个double。
12:13
Double的话呢,它是一个这个这个对象啊,这个对象,这个对象怎么着呢,我们看一下CL shift t这个double double进来它呢,继承1NUMBER,你看它实现了一个接口,叫做comparable。这个咱们后边讲这个集合的时候,会说这个comparable,你看这个名字就能知道啊,就是对叫可以比较大小的,本来呢是两个对象,对象按说是不能比较大小了,当然这时候呢,我们double呢,实现这个接口了,就是说你可以比较大小,其实说白了就是你这个double封装的那个double的那个值,小写的那个double的值,比较一下它这个value到底是谁大谁小了,但至少呢说人家可以比较大小了,那既然可以比较大小,咱说白了就是不用咱自己去写了,哎,所以这块呢,是相当于是使用这个,哎或者这个这样说吧,当属性呢,声明为当属性readus声明为这个包装类这个double类型时。
13:18
我们说呢,诶可以呢,去调用包装类的方法,诶这个样子,那么我们这呢,是一个double了,Double呢,我们直接点一下,你发现呢,它还真有一个方法叫做compare to。这是人家double里边的一个compare to,然后我们就调一下,直接呢,咱们拿着这个c.get一下read扔进去,那它呢,就自动的帮你去比较大小了,我们做一个return。就OK了。哎,这个呢,正确的你可以看成是这个叫方式一。哎,这个呢,咱们也可以考虑,就是当你这块呢,如果是这样一个情况的话呢,我们可以用一下这个叫方12了。
14:01
这样哎,他都给你写好了,我们直接调个现成的行回过来这呢,还是这个三点几都,然后我们走一下照样没问题。这样没问题,你可能会想说,哎呀这个人家这一行,然后这好几行,这个确实是人家这个好,其实呢,也不一定,他只是说呢,里边给你封装好了而已哈,你看你点这个compare two,它去double调调一下这个compare点一下是不是还是这么着。这个值不就咱们刚才自己写的逻辑嘛,对啊,只是说呢,你要么你自己写,要么呢你就调个现成的,仅此而已啊,仅此而已,其实效率上的话呢,要说它还慢一点呢,是吧?哎,当然本质上呢,这俩差不太多哈,因为属于一个同同一个数量级上的了,所以差不太多行,这呢就是咱们说的这个关于比较的这个问题了,那自然而然的就是当我们如果往里边扔进去的是一个非这个circle的话,那那个这个咱们也可以测一下,比如说我们这int,我这还写一个叫compare compare value61,那我这拿一个ce.compare to,这呢我去new一个string吧。
15:08
这上写一个AA,放进去一个非我们这个comp circle这个类型,那此时的话呢,我们执行会是什么情况。此时这个我就不去out了,我就直接把这个值输出一下,这个呢,那就看咱们这个方法咋起的了。目前咱们是不是成这样了,对,那目前呢,只能是返回一个零,返回零,那咱们要是讲完这个异常以后呢,这个你就可以用下边的,就把上边这个就关掉,你抛个异常说呢,你要让我比较大小,你你别传那个类型不一样的。那你要是传了的话,我就给你抛一场。这呢是咱们自己写的这个话。诶就这样个情况啊,你别看到这个红色的就紧张,这是咱自己写的啊,你别去调了,你调就把自己写的就删了,就这个就是这样子的,谁让你传的不对呢,要改也是改这儿,你别去改那个代码,别去改这儿,在这个意思啊,行这儿呢,咱们就说完了这个练习的意义呢,一方面呢,大家在熟悉一下这个接口的事儿,需要去实现,另外一个的话呢,这里边其实隐约的提到了关于比较两个对象大小的这个操作了,这个咱们到后边讲到集合的时候呢,诶重点呢,也谈不上重点,只是说其中之一的一个知识点,就是怎么呢去比较两个对象的大小,这个操作呢,在实际开发当中呢,确实有它的应用情景,就是咱们呢,不管是手机端还是浏览器端,大家呢,你用美团外卖呀,用这个商城啊,乃至于说大家用新闻看新闻呀,这里边的每一个item就是每个这一项,其实呢,我们都可以把它看成是一个对象了,这里边这不有很多对象,那么这些对象按什么顺序排他排的顺序不。
16:53
不一定呢,是你底层数据库里边这个先后的顺序。它呢底定数据库可能是123456,按照你添加的顺序去放的,但是我们这时候展示的时候呢,不一定是这个顺序,那这时候呢,我们就可以按照指定的一个顺序,那EIG呢,就是这个对象呢,得是可排序的,这是可排序的就是可比较大小的,那怎么比跟咱们现在说的这个逻辑呢,有一些相似之处,这个咱们讲到集合的时候呢,说一下这个对象怎么比较大小啊,说白了其实也是比它内部的某一个属性呗,对吧?啊,你整个对象不能比了,我看看你的这个价格是吧,价格就可以比啊,我看看你的这个大家的这个评分,嗯,就是还是转到那种数值上,比较它的属性的大小。
17:38
行,这个呢就过了。
我来说两句