00:00
行了,那这个to方法最后咱们还说了一句啊,就是这个你也得记住。对,你不调toth润,它这个print line这个也调,也也会调to toth润啊,我我说一下各位啊,如果你要能翻源代码的话。你可以翻一翻print LN这个方法的源代码,你看看他底层掉没掉那个toth论,Toth论方法你找找你找找啊,我我我这句话是说给咱们班这个可能这个目前为止啊,这个之前有底子对吧?啊,这个这个这个这个这样的同学啊,如果说你之前是小白,你就别翻了啊。你可以翻一下这个print LN,它为什么在底层会掉吐斯顿方法,哎,你翻着翻着翻着就会豁然开朗,我在这里就不翻了啊,不翻了翻不了几步啊,但是我不敢翻,现在啊,一翻你就懵了啊,行,咱们先不不说这个了,那么接下来咱们继续再往下啊,咱们继续再往下,那么再往下的话,嗯,咱们看看哪个方法呢?刚才说了啊,我们这个奥里边方法有好多是不是?哎,其中有个方法我们叫什么?叫做toth论,那还有一个方法我们叫什么呢?叫做。
01:06
我们看一下equals方法,各位。嗯。来在这块呢,点右键啊。诶,我们去新建一个。零二。注意听课啊,集中精力。一共就这么几个常用的方法啊,关于这个object类中的什么呀,这个equals方法。来,首先看ES方法的源代码。源代码啊,Equals方法的源代码,那就找呗,源代码咱们直接扒过来从这找吧。S。哎,再找再找再找再找再找再找,哎呀。呀,这个,哎,你看默认有这样一个实现,又懵了吧,这是个什么什么鬼东西。
02:07
这是object equals的一个默认实现啊。就是以上这个方法是object类的默认实现。啊,就是长这个德行,那么E公司设计ES方法的目的是什么?S公司设计equals方法的目的是什么呢?是啊,通过equals方法啊,就是以后啊,以后。编程的过程当中。都要通过equals方法来判断两个对象是否相等。Equals方法是判断equals方法是判断两个对象是否相等的这样的一个方法。
03:10
啊,就是我们需要研究一下object类给的这个默认的equals方法够不够用。我们需要做这样一个研究,各位就它默认的实现,你看是这个样子的。对吧?哎,默认的是这样的,我再强调一下各位啊,我上来第一件事我就跟你说明,告诉你方法,这个方法的设计目的是什么?是用来判断俩对象是否相等不相等的。明白吗?那判断两个对象相等不相等。这种业务实际上以后的开发我们还是哎会重复出现的啊,情况还是比较多的,因特星A呢等于100是不是,哎,然后int类型的B呢,等于什么呀,100,然后接下来system.out.print打印输出A等于等于B,哎,判断。
04:12
两个基本数据。类型的判断,两个基本数据类型的数据是否相等,直接使用什么就行。双等号就行对吧,那么判断两个Java对象是否相等?我们怎么办?能直接使用双等号吗?啊来我们先编译一下各位啊,你看两个基本数据类型,这个东西里边保存一个100 B里边保存100,那这样的话,A等于等于B是不是最后的结果就是true啊对吧?处就代表什么呀,代表相等吧。
05:00
是代,是不是代表相等,如果是false呢?就代表不相等呗。对吧,是不相等啊。这是我们的基本数据类型,你别忘了,在Java语言当中,除了基本数据类型之外,还有一种数据类型叫引用数据类型,引用数据类型指的就是Java对象,那你判断两个基本数据类型相等,相等有这样的业务,那我们以后有没有这样的业务呢?就是判断两个Java对象是否相等,这样的业务有没有有的。那如果我们判的两个加号对象是否相等,能不能用双等号呢?哎,我们可以尝试一下,我们可以尝试一下来这里我们仍然把我们刚才写的这个程序啊,哎,哪个程序啊,就是我们这个mytime这个这个这个这个这个这个类啊,我们拿过来。放到我们的程序当中啊,然后接下来我把这个to删掉了啊,不要了,不要to了,各位啊好,我只给一个无参构造,再给一个有参数的,哎,构造方法给三个属性,那么我问大家一个问题。我们在这一块。New一个my time对象啊,T new一个my time。
06:04
假如说我指定的是什么?是2008年的8月8日,那么我同时又去拗了一个对象。你用这个对象的时候,它的时间表示的也是什么呀,2008年8月8日啊,就创建一个日期对象是。2008年8月8日。对吧,这里创建了一个新的日期对象啊,但表示的日期也是什么呀?哎,2008年的,哎,8月8日,那么接下来我们来看看,哎,我们来测试一下啊,测试一下比较两个对象是否相等,能不能使用双等号啊,能不能使用双等号来system.out.line打印输出T1等于等于T2,好,我问你双等号能不能判断出来这俩对象相等不相等。
07:14
行不行啊,双头号行不行。告诉我。不能。为啥?不可以,为啥?双等号比较的是内存地址啊。双等号比较的是不是这两个变量里边保存的东西对吧?好,大家看这个双等号比较是不是A里边保存的100和B里边保存的100是否相等对吧?那就这个双等号,这个双等号是判断A中保存的100。和B中保存的100是否相等,那下面这个双等号判断是什么呀?
08:01
你的my time t1,实际上你等于0X1234,你再往下你又扭了一次新对象,你是不是一定会有一个的内存地址啊,叫做0X3698,好,大家看这个是T2吧,好,我问大家T1等于等于T2,那么此时比较的是不是T1这个变量里边保存的这个内存地址和T2变量里边保存这个内存地址啊,所以这个双等号判断的是什么?注意这里的双等号啊,这里的双等号。双等号判断的是什么呢?判断的是T1中保存的内存地址,保存的对象内存地址和和T2中保存的对象内存地址是否相等。
09:01
对吧,所以这个结果是不是false。因为你拗了一次,又扭了一次啊。对吧,哎,你这个结果是不是false,来编译一下,编译之后呢,再重新编译啊,叫做TEST02点伽码,编译之后我们加va去运行TEST02走。好,大家看一个是true,一个是false,谁是true啊,上面的这个是true。下边这个是false,为什么是false?因为你T1这个变量里边保存的这个内存地址和T2这个变量里边保存这个内存地址不一样,而双等号比较的是内存地址,你明白吧,所以这个结果是false。好,但是我再问大家一个问题,T1表示的时间是2008年8月8日,T2表示的时间也是2008年8月8日,所以我问你T1和T2俩对象是不是应该相等啊?所以呢,双等号能不能判断两个对象是否相等啊?
10:01
这个逻辑推理。没问题吧?各位想一想,T1表示的时间是不是2008年8月8日,T2表示的时间是不是也是2008年8月8日,所以大家看T1实际上和T2这两个对象表示的时间是一样的呀,那我们就可以认为它是同它是相同的呀,它是它俩对象是相等的,我们可以认为是两个对象是相等的。但是你双等号一判断它是false,所以比较两个对象是否相等,不能用双等号对不对。不能用双等号啊,大家理解吗?来。这里啊。我写到这儿吧,判断两个Java对象是否相等,不能使用双等号,因为双等号比较的是什么?两个对象的什么内存地址?
11:08
对吧,哎,双等号比较的是两个对象内存地址。好了,那么接下来我们反过来看看什么呢?我们看一下object这个类当中的源代码。就这个源代码。这是一个默认的实现。大家看这个源代码当中是不是用了等双等号。是不是用的双等号?Equals方法的equals方法,设计这个方法的目的是什么?还记得吗?这个方法的目的就是来比较两个对象是否相等,对吧?但是这个类里面这个方法。里边给的是不是双等号啊。所以我们大家object类里边给的这个E方够用不够用。我们是不是需要在子类里面重写equals?
12:01
如果你不重写equals,我问大家是不是它会掉OB里边equals。Equals方法是不是里边用的是双等比较比较的,而我刚才讲了讲了半天,我等怎么着。是不是不能比较两个对象是否相等啊?你这里你你看见没有object默认实现以上这个方法是object类的默认,现在object类在object类中的equals方法。当中,在O类中的equals方法当中,默认采用的是双等号,判断两个Java对象是否相等。对吧,哎,是否相等。我写到这吧。嗯。在OB类中,Equals方法当中默认采用的是双等号判断两个加对应是否相等,而双等号不能判断双等号。
13:06
判断的是两个Java对象的内存地址。我们应该判断两个Java对象的内容是否相等。所以,所以老祖宗的equals方法。不够用。啊,需要子类重写equals。你明白什么意思?有同学还在不懂什么意思,我问大家,这个类是不是继承了?这个类当中是不是有一个方法叫equals?默认的ES方法是不是长这个德行?
14:04
对吧,你不写他有没有各位告诉我,你不写他有没有,你不去继承他有没有各位告诉我,有吧,你不去继承,它默认继承object,你这里边方法不去写equals,它这个类由于继承了类,所以这里面有一个默认的equals方法,那我问大家一个问题啊,你看看。重写object equals方法之前,我们来看一看T1是不是一个对象,T2是不是另外一个对象T1我问大家是不是这个类型里边有没有这个方法叫S对吧?我们equals是一个方法名点调调方法呗,t1.equalsequals方法里面需要传个参数object,好,我问大家,大家能不能把T二传进来,这是不是多肽?t1.1cos t2。
15:01
这个方法上是不是接收一个object呀,所以我们能不能把T二传进来,各位可以吧,T一点EST2,大家看这个方法执行结束是不是返回一个布尔类型。对不对,好,大家分析一下,分析一下啊,分析一下各位啊,停下来啊,听我说T1是不是this。T1去调这个方法。这个方法在执行过程当中,这个this是不是就是T。双等号后面的这个OBJ是不是就是这个参数。你T2是不是过去了?所以我问你这个是不是就是T。后边这个是不是就是T2。T1和T2是不是采用双等号的方式进行判断。所以object里面的方法,它判断的是不是对称的内存地址。
16:00
对吧。哎,没有人回应我。各位。来编译一下零二.java Java运行啊,B已经定义过了。我们叫flag吧。Flag啊。再来编译,再来运行,最后结果是不是false。这个结果是不是输出false,它为什么会输出false啊?因为你调了E方法。你equals方法里边。用的是双等号。这个this指的就是T1啊,这个obj就是T2嘛。对不对,显然我们object这个方法不够用,我们需要在这怎么着,哎,重写equals各位啊,重写equals方法,重写谁的equals方法重写object类的equals方法重写你复制粘贴过来啊。
17:03
重写有一个什么什么,怎么重写怎么重写,各位复制粘贴吧,哎,复制粘贴相同的什么。返回值类型吧,相同的什么方法名吧,相同的什么形式参数列表吧,你这个是object。你重写之后,这个是不是还是object对吧,只不过这里的代码你需要去自己写。当当什么当年相同?对吧,月相同并且日也相同的时候,表示两个日期相同。两个对象相等。那你就在这写代码吗?对吧?哎,你需要把这个代码写一下,写一下,最后写完之后return一个false啊,或者是return true啊,你相等就返回true,不相等就返回false,总之这个方法需要你去重写。
18:08
你有没有发现老祖宗的方法,他只是给我们带过来了,但是这些方法是不是都需要我们去重写呀?大家思考一下,想想。
我来说两句