00:00
下边呢,我们提到这个叫object类的一个使用,首先关于object类的一个说明,这块的话呢,咱们我这这块呢,这个把这个知识咱们要往回收一收,把它变得薄一点。我这类呢,我们描述了这样的几个事情。大家作为一个了解就可以了,重新放啊,哎,不用调啥了,就直接变小一点。CTRLS一下,首先呢,Object类类呢,是所有类的一个跟服类,这个大家都知道,然后呢,如果我们没有显示的指名复类的话呢,那就是集成的object里边的属性呢,没有方法的话呢,有一些这些方法当中呢,我们后续呢其实都会见到。只是说呢,像这个clone啊,像那个finalize这块用的少一些了,像后边呢,我们讲到反射的时候会提它,讲到集合的时候会讲它,讲到线程通信的时候呢会讲它,然后现在呢讲的是ecos和吐S阵,因为呢,人家作为一个负类的话呢,这些方法呢,具有通用性,所以呢,我们在用你自己定义的类,或者是我们API提供的一些类中的方法的时候呢,会用到这样的一些方法,说它呢,只定义了一个空单构造器,这这就没啥了。
01:18
这没啥了,那么在这呢,再稍微的提一个事儿,就是咱们这个object啊,包括后边咱们又提这个包装类了,这个object的话呢,从类的角度上来讲,它是作为一个跟服类出现的。咱们讲引用数据类型的时候。引用数据类型的话呢,咱们这个其实是有是有三三种体现啊,一种是不是叫类啊,有一个叫数组吧,还有接口,接口呢咱们还没讲,所以暂时呢先放一放,那这个数组,数组的话呢,咱们当时讲课的时候,是不是就只提过数组的一个属性叫做点LA啊,那除了点之外呢,似乎也没有用过别的是吧,那现在呢,咱们讲的面向对象是不是主要呢,说的都是类啊。
02:06
那你说这个类跟这个数组这块什么关系,可以看成是并列关系,你看从形式上他们也确实不一样,对吧?但另外来说的话呢,实际上这个数组也可以看成是一个结构了。或者你也可以把它看成是一个叫特殊的类。那么数组的话呢,咱们也没有提说数组去继承为谁,只有数组的元素才会考虑,如果你的元素是个string,你看string继承谁,你的元素是一个,比如customer是一个customer类型的数组,你看customer继承谁,这都是又回归到类的层面了,那我们这块呢,多说一句,就是数组的话呢,整体上来讲,虽然没有提继承,但是呢,你可以把它也看成是一类特殊的类,也看成是它继承于object了。那什么意思,看我写个代码。
03:06
Com,点艾特硅谷,点Java。哎,我这呢,写一个叫review的一个test测试啊,哎,复习。嗯,复习复习的话呢,咱们讲过单元测试方法了,那就顺便呢用一下。行,实际上我们写的时候呢,都会这样,上来就用,实际呢这块呢没有我就直接呢做一个ADD了啊,用不着这块呢,非得去这块build pass等等等等这样了啊这样比较快一些,那么这里边我想测个什么情况呢?看这个事,我这呢就写一个方法,我写一个就叫print吧,在这里边我声明一个叫object类型的一个obj,然后在这里边呢,我就直接out一下obj。很简单的一个方法,那么在这块的话呢,我想去调用这个叫print方法,那你就需要传一个OG,那我肯定是可以放它的子类对象,但是现在呢,我能不能放进去一个数组。
04:07
这呢我写一个123对吧,然后把这个AR往这一扔,你发现OK。没问题,那么这时候调的方法呢,你往这一放,不就是我们下边写的这个方法吗。所以说呢,我们其实呢,一定程度上大家可以把这个数组的话呢,看成是一个特殊的一个类了,就是它呢,也可以认为呢,你算是继承我们这个object一样认为呢,就是我们数组呢,也可以用object当中的这些功能。先看一下这个方法啊,我们这块呢,去做一个print输出,那结果是什么呀。对,地址值呗,地址值行,然后呢,你看我们这个A2点,你看我能点出来的东西,后边呢,就是虚的这个呢,就是你这个方法是谁定义的,你看是不是都是object定义的,从这个层面呢,你也能够证明,就这个数组呢,可以看到是它是不是也继承于我们的object呀,或者说呢,你再这样一下,我这就直接呢set out a点,既然呢,你能够用object当中的方法,其中有一个是不是叫get class呀。
05:09
获取你的负类吧,哎,获取你是哪个类吧,这个我要执行的话是啥呀。嗯,这个这个不会是get,我这本身这不是个数组吗?这叫get,他自己就你这个对象的,你的你是哪个类造的,我是不是一个一维的数组,是一个int型的呀。对,是这么着啊,然后呢,我们再去get一个叫super class看看。能行吗?哎,就是我们把这个数组呢,是不是也可以理解为这个作为我们object的一个子类了。所以相当于这个时候呢,我们这个object的话呢,它确实还真是一个跟赋类了这块的体系下呢,一方面是咱们说的这个类结构,同时呢,是不是把这个数组这些呢,也给融进来了,那接口的话呢,这个咱们到后边说接口呢,是比较特别的接口呢,是独立于我们这个类体系的一个东西了,那个呢,我们后边再讲,后边再讲好这块的话呢,大家把这个数组的话呢,相当于也在理解理解就是它呢也能够融到咱们这个体系里边了,那还有一大部分内容没有融的,就是我们的那个基本数据类型嘛。
06:23
基本数据类型跟我们的object是不是没啥关系啊?对吧,诶对,所以说咱们希望把它融进来,这不是才讲了一个包装类嘛,就这个意思,好那个一会再复习那个事儿再往下,那么object这个当中呢,我们这个主要提的是两个方法,一个叫equals,一个叫初论,大家现在呢,要把这两个方法昨天讲完以后呢,现在要把它变薄。其实没有什么大不了的,虽然说讲的很细啊,但是真正开发中用的时候呢,那都是很基本的一个使用了,首先提到关于这个叫EE这个方法的一个使用,这呢咱们写了好几个点。
07:00
就是下面这写的这样的几个点。具体细节的话呢,咱们刚才考试是考试的时候呢,也考这个问题了,所以详细的话呢,就不过多的这块去说了。这个这个我这个往后移一下吧,CTRLS一下就不过多的去说了,这个你需要知道的就是我们这当中怎么定义的,是这样定义的,相当于然后呢,这个人家有一些类呢,重写过了,比的呢是内容。比较的是内容,那咱呢,要是去重写的话呢,也得比内容,那下边一个问题就是我们该如何去重写,就是落脚点呢,就落到这儿了,这块呢,大家理解一下,这个都不难,那我们重写的话呢,手动重写一个举例,咱们刚才呢,这不是在这儿也写了一个。就这个,我把他那就拿过来了,CTRLC一下。有点太。
08:01
距离呢,间距太大。间距大啊,那就那就那就这样吧。行。间距确实有点大,这个核心的话呢,就是我们这个一库方法,咱们是这样子写的,这个写好了,那么真正开发的时候呢,咱们说都是自动生成,自动生成的在eclip当中的话呢,我们就直接点这了,在这个idea当中也可以自动生成这些功能呢,在开发中咱们都不会自己去写的,那咱们看下这个现成的这个。哎,就是长这个样子的啊,这呢是自动生成的,那详细的话呢,这个就不说怎么自动生成了啊,这个我就在这列了,那这里呢,涉及到一个面试题,就是我们考察的说等等和equals有什么区别,那另外一个点呢,大家需要对这个equals呢也得清楚,咱们这呢相当于是一个回顾。
09:05
诶,回顾的点呢,我就写到这了,CTRLC。转过来。行,这呢就不用再多展开去说了,这就过了,那么讲这个to顿之前咱们再说一下,昨天呢提到个问题,手动写的和自动生成的还是有点区别的,我们写的这个呢,说差点意思。那大家呢,说下来思考一下,说我们写这个漏洞在哪,为什么这个说人家写的好,就是在大部分情况下呢,两个都行,但是在有些情况下呢,人家这个是对的,咱们写这个呢不行,那有没有同学呢,想到这个反例是什么?有想有想到的啊,后边的孙杨说上,呃,如果说你的这个两类的话,你说比较呃,比如说老师举的那个人和动物的这个例子,人它有名字,它也有年龄,动物的话它也要,它也会有名,人的名字和动物名字,以及人的龄和动物的名字是一致的话,那么根据老我们所写的这段话,它所较的。
10:18
嗯,他刚才是这样说的啊,这个虽然说说我,那你这个equals方法,你是生命在person类里,还是生命在animal里类里。可以写都可以写都可以写,但是你调的时候你掉的是哪个呢。他刚才这样说,他说呢,我们定义的人,定义的动物,人跟动物呢,假设都有name和age属性,那我恰好呢也让定义两个对象,一个是person,一个是animal,然后呢,他们的name和age呢,恰好也都是相同的,比如都叫Tom,那都是比如说年龄五岁了,那么当去调用equals的说,这时候你可能会返回true,但实际上呢,不该是true,不该是true没问题,但是呢,你怎么它就返回true了呢?那你得看你E你调的哪个呀。
11:14
稍微差点意思,把那个animal呢得换一下。Animal得换掉,因为animal呢,在咱们举例当中,从来让他跟人事里没有关系的两个类,你现在呢,让他们得有一些关系,就是我一个是用person的对象,一个呢用你可以用慢也行,用慢的对象,我在person类当中重写了一下equals。慢当中呢,不要重写了,就用person里的。那么我们造一个person的对象,造一个慢的对象。我让这俩你谁都行啊,因为就是同一个E方法了,你用M去调ES,把P放进去也行,或者P调ES把M放进也行,这个时候的话呢。就有一些问题了,为什么?
12:03
或者说这个时候呢,我们要是通过这个P,这是个person new的一个person,我们呢,再把行三位置放一个MM是new这个慢,这个先从情理上来说,你觉得应该是就是我们重启啊,你应该是让他处还是false,应该是false的,因为你你俩你你这new了个person,我这new了个慢,然后那个只是说属性一样,但是你俩像类型都不一样是吧,应该是一个force的,但是你想想咱们要是掉自己这个呢。那就成一个处了,对,咱要是用咱们自己写这个呢,就变成处了,来证明一下。嗯,证明的话呢,这块我得去造相关的这个结构了,这块我就稍微省点事,我把这个person这块呢拿过来一下,CTRLC把这个慢也CTRLC拿过来一下。CTRLV。这里边儿没有必要的一些东西呢,我就给它干掉了,这个这个删掉它啊。
13:04
然后慢这里边慢里边呢,像这些呢,咱们暂时也都用不着了,行这个就比较简单一些,这样一个结构吧,其实这些方法的话呢,暂时我们也都用不着,在这个person这里边呢,我们去重写一个方法,重写方法呢这里,呃,重写以后的方法,这就涉及到我们是自动生成的还是手动写的了,咱们先用一下软件自动的这个。第二页这个方法,然后OK,此时呢,这个哈code没有用,大家呢可以先干掉,不用管,这呢是写好的ES,那接下来我在这里边呢,进行一个测试。诶,在这呢,稍微注明一下,咱们刚才只说的是数组也作为我们object类的子类出现。啊,可以调用这个object类中声明的方法。
14:01
行,这是咱们刚才说的这个事,然后下边呢,说这个第二个事儿,这个咱们主要测试呢,就是我们这个手动写的ES和自动生成的ES的区别。手动写的和自动生成的equals的区别,然或者要区区别它俩也行,好CTRLS一下,嗯,此时的话呢,我们这个P呢,这不有一个这个呢,我们写一个这个带参的构造器,Auto shift s2个参数,OK,然后呢,在我们这个慢当中,我也定一个。这这不也提示我去生成了。CTRLS回过来。这个时候呢,我们去new一个person。Out,斜杠。
15:00
我叫汤姆。12岁。然后我们去扭一个慢。斜杠。也是12岁,正常来讲呢,这两个如果要用equals比,应该是false才对。这个你用谁调都都一样,用M调也行,用P调也行,反正他俩用的是同一个方法。这呢是咱们自动生成的,此时呢,我们执行一下。结果呢是个false,应该是这样子的,但是呢,如果我们要自动去写,把这个呢注释掉。这个具体的写法呢,跟咱们刚才写的这个呢有类似,我就把它呢先拿回来了,CTRL塞一下。Ctrl shift f,把这个位置呢改成一个person。这个我也改成个小P吧。行,这没问题吧,这是我们手动写的,那手动写完以后呢,我们回过来这个时候我再去调E4的时候。
16:09
你看我们就变成是个出了,就这呢,就属于一个漏洞,或者说呢,我们写的这个不大好。那为什么到这呢,咱就变成处了呢?女,这个逻辑没问题,我们把这个慢呢放进来,这个营地址不一样,往下走慢person对吧,显然是个处。那你是个处了,我这强转成个把,把你这慢先付给一个object,再把object强转成个person,这个是不是也可以啊。对,然后呢接着比,这呢是new的一个person,你这呢,你其实是new的一个man,但是他们俩的age和name呢,还确实都是这块一比,都是true。事实上呢,不应该这样,这就是咱们写的这个呢一个漏洞。那这个当然再次证明了,开发中呢,咱们都是自动生成的,那么人家写这个的话呢,就要好一些。
17:01
Ctrl shift f一下,它这个写的时候呢,它不像咱们这用的是叫instance of,我只是判断这个对象是不是这个类型的。不一定,我这个obj是不是就是new的一个person啊,你只要是person的子类的对象,是不是这也是一个处啊,对,这是这个问题,而这个题目当中,它用的一个更严格的一种比较,比较的呢叫get class,我判断呢,就是你这个对象它是有哪个类造的,像这个obj你要是一个用的一个慢,那这获取到的就是一个慢,它的类就是慢。所以他这个呢就更严格一些,具体这个细节呢,这块就不多说了,这就有点太细了,大家有兴趣的话呢,你可以看看人家这个逻辑是怎么一点点排的。啊是这个情况,开发当中经常你会看到一些方法重启的时候呢,他经常会先这样的话,就是处那个就是呃,这样是false,这样是false,这样是false,他先把那些不对的情况先一个一个给你摘出来,常常都在这样做,大家呢,也可以去想想他这个逻辑怎么写的,这个我就不在这多说了,好这就过了啊,那么以后呢,大家就记住一点,我们都去直接自动生成就完了,就现在我们讲这个知识的时候呢,我们收写了一下,那么再接着呢,我们讲到这个叫to string方法,那to string方法的话呢,这个比较简单了,就首先to string它的一个基本使用。
18:27
基本使用这呢,就提到这个事儿了,跟我们这个equals这个套路一样,先呢,你看一下这个object当中它是怎么定义的,然后呢,看看人家有一些类,人家是怎么重写的,然后咱们呢也这样去重写,就这个意思,CTRLC。拿过来。这样子。CTRLS1下行,那这几个点完了以后呢,我这写了一个第一句话说呢,当我们输出一个对象的引用时呢,说实际上呢,就是调用当前对象的测算方法,这个都能理解吧,但是这句话呢,我再给你举一个稍微特别的情况。
19:09
就我们讲课的时候呢,把这个一般的内容都给大家讲清楚,然后复习的时候呢,让你见点不一样的。关于叫投资人方法?好,刚才不是说了吗,说你这个调一个对象引用的时候呢,相当于就调它的图存方法了,我这呢写一个死string形的S,我叫ABC,我现在呢,去这个输出下叉,跟我直接调这个to string这呢确实是一样的,那由于人家那个string的话呢,已经重启了to string方法了,所以呢,这时候你输出的就不是地址值了,就是你这个实题内容,这是没问题,这俩是一样的,但是现在呢,你看我S等于no。这个时候你俩还一样吗?
20:01
就有区别了。先说这个吧,我这是个闹,我吐,这会出现什么问题?对,这肯定会出现控制人了。出现这个异常,但是我们上边这个呢,就没出。你看。首先呢,我们这嗯出来一个闹,这个闹你可能不知道是上边一个还是下边一个,实际上是上边这个输出的,你非要说这个嗯证明的话,那就我这只能是加一个换行吧,或者换行你又看不着这个换行了,我加一个星吧,这样。我是星之前出的,所以说呢,我们是上边这个打的应该是个闹,下边这块呢,你看它爆红了,出错了,工人一场十五行,就这一行,那么这个位置的话呢,它输出的是一个闹。也就是说呢,在绝大部分情况下呢,这个事儿都是对的,除非呢,就是你接手的这个对象啊,他是一个。
21:03
它是一个闹,你要是闹的话呢,你显示的调和我们直接写一下就有点区别了,也就是说呢,比如咱们生面的一个person,咱生个person叫P,如果你这个P呢,就是一个nor,我们直接S也是P,是不是输出的,就是我这只是拿死string来举例子了,那你要是P点一个什么,是不是一定有控制帧了,对,就是还是有那么一点点区别的,其实主要原因是什么呢?主要原因就是我们这个print line的时候,你看我把这个,因为咱现在放的是字符串了,我把这X拿过来以后,它在这块呢,去print,我在点它有一个保护机制。它有个保护机制,就是判断一下你是不是闹,你要是闹的话呢,就别再去写了,别去调那个吐斯瑞了,直接呢,我就把你认为就是一个字误串的一个闹了。它就相当于是就避免了我们像这样的问题,对控制帧,因为有的时候呢,咱们确实可能造一个对象,呃,赋不赋值呢不太清楚,然后呢,后边出来一个控制帧异常,然后我们想去排的时候呢,咱们说除了用debug比debug呢漏一点了,就咱们自己是不是去写这个c out呀,咱们自己写c out的时候呢,你把这个P往这一放,如果你这个P它确实是个no的话呢,这块不会报异常,它只是呢给你默默的呢写出来这个no。
22:23
嗯,这样的话呢,程序它能够走走,你要这块呢,一报控制帧,那就得是看里边的代码是吧,所以这块呢,其实相当于直接光写一个引用的时候呢,有一个保护机制,就是呢,你要是个闹的话呢,就呃避免让你再去调方法,直接呢就把你输出是个闹。行,这是一个小的一个点啊,这个呢,大家也关注一下就行了,所以说我们钓它的时候呢,相当于是掉它了,但是其实有个前提就是你别空,但是整体上来讲的话呢,都是它,所以这个我就还放在这了,那么我们自己的话呢,可能会涉及到重写to string,当我们后边希望去C槽的一个对象的引用时呢,不要给我带出来地址了,而是出来我们这个对象的一些属性的信息,那我们就去重写,那怎么去重写,这个也比较简单。
23:08
重写的话呢,咱们就那那直接在这写一个这个重写的一个啊,在这写了这个规则了啊,这个原则就是重写呢,就是返回它的实体内容,这呢直接举个例子。举个例子,这呢我就直接拿过来这样一个例子就行了,这呢是咱们这个自动生成的,这个也用不着咱们去这个手写了,自动的去生成。CTRLS一下就是把我们这个这个对象的类型和它的这个属性呢都列出来,好,这个面试题这块,这个面试题的话呢,应该算是有两个,第一个的话呢,就是咱们讲这个object的时候。提到最后这样一个面试题,这个面试题的话呢,目前咱们还说不了,因为呢,这个final啊finally啊还没讲。讲了以后呢,这三个你可以说说,但这三个呢,之间也没有任何关系,你就各说各的就可以了,就是因为长得像,所以才放一起的,第二个呢,就是关于这个等等和ES这个题目呢,咱们已经考过了,就分别呢,大家去描述一下这两个结构就OK了。
24:16
行,这就不多说了。
我来说两句