00:00
那行了同学,那咱们继续再往下吧,那object类当中啊,咱们研究了这个to论方法,研究了equal方法是不是哎。如果ADDRR为囊的话,Equals还会报空指针吗?ADDRR为捺。ADR为那那当然会啦。如果你这边传一个空进去,你这边也是传一个空进去,如果这个是空的话,那这里就会出现问题了。就出现问题了啊this.a点是空调equals,肯定会出现控制异常啊,红敏说的对啊,你可以在这加一个控制,可以加一个控制啊,其实这个name也有可能为空的。你如果不给这个name赋值,这个内不是也是空吗?空的话就调E方法,肯定会出现空指针异常的,空指针异常啊行。嗯,比这对象有什么用?那当然有用了呀,以后我们在程序当中比较两个对象相等不相等,就靠equals吗?如果equal方返回处就代表相等,如果equal方法返回false就代表不相等啊。
01:02
那比较这对象有什么用?咱们以后比较对象就是靠equals方法,不能靠等号,也不能靠别的,就完全靠ES了。你以后在开发中会去比较两个对象的,有这样的业务啊。有这样的业务,你你在程序当中创建了一个对象,你又创建一个对象,你想看看这两个对象相等不相等,你会自动自动自然而然的就会去调E的方法,如果那个时候如果E的方法不重写的话,你这两你你这就出问题了呀。除了你的那比这两个对比这对象有什么用,你现在不是还没开发吗?不是还没开发吗。是不是啊,没有具体的项目呢啊,你在具体的项目当中你就知道了哦,我们可能有的时候需要比较一下,两个对象相等相等。对吧,哎,那到时候你就知道了,现在呢,就你先知道这个有一有这么一个以后的方法啊,有这么以后的方法行吧。行,那么刚才咱们说到哪儿没事儿啊,你要是有疑问,咱们课下再去沟通啊。
02:00
登录账号功能可以这样对比吗?嗯。可以没问题,可以比啊行,咱们继续往下了,那么再往下呢,咱们ES方法再往下就是说一下这个final line的方法,各位啊方法。首先,这个方法是protected修饰的。啊,在。啊,这个方法的源代码是你看看啊,很有意思。把C盘下的这个program file打开,Java打开,JDK打开,然后library打开src打开Java Java long,然后我们找object,找到这个类之后呢,我们找一找这里的方法,这个方法叫final line方法,好,继续继续继续好,大家看这个final方法是不是有一个大括号,大括号是不是啥也没啥也没有。
03:03
来,咱把它列拿拿过来放到那啊,你看all里面find方法是不是只有一个大括号,大框里是不是什么也没什么也没写呀。对吧,哎,这是final啊,Final方法,那么这个方法是干什么用的呢?诶这个给大家解释一下啊,是很有意思的一个方法来在哪呢?在这个CHAPTER18下点右键啊,我们新建一个,比如说TEST06。就关于什么呢?关于object类中的叫final方法。啊。呃,首先第一个问题,在object类中的源代码是什么?是这个第2OBJECT类。啊,或者说finalize方法。啊,只有一个方法体啊,里面没代码。
04:02
对吧,而且这个方法是protected。修饰的啊,第三这个方法不需要我们程序员调啊,这个方法不需要程序员手动调用。啊,GJVM的垃圾回收器。负责调用这个方法。注意啊,就这个方法呀,它是它是什么呢?它是这个。什么时候被调用,我先说一下啊,它是在这个对象被垃圾回收的时候,垃圾回收器会自动调用这个对象的方法。啊,Final方法的执行时机,Finalize方法的执行时机是什么?当一个Java对象的。
05:01
当一个加法对象即将被什么呀,垃圾回收器回收?的时候,垃圾回收器负责调用什么呢?Find方法啊方法,嗯,通常在这个方法方法当中写什么代码呢。Finalize方法实际上是sun公司为Java程序员准备的一个时机。啊,叫垃圾销毁时机。如果希望在垃圾在这个在对象销毁时机执行一段代码的话。这段代码。要写到哪啊,写到find方法当中。
06:05
就有点儿类似于什么呢?哎,有点类似于静态代码框。你还记得静态代码块吗?各位静态代码块的作用是什么?Static大括号是不是这边呢,去执行一段代码,那么静态代码块在类加载时刻。执行,并且只什么执行一次。这是类加载时机是吧?哎,这是一个散准备的类加载时机。明白吗?而你的finalize方法呢?Finalize方法同样也是为程序员准备的一个时机啊,或者是时刻。这个时机是垃圾回收时机。
07:03
啊,就是你你比如说这个这个就有点有点什么呢,有点像这个举个例子啊,啊,这个方法它有点像什么呢?有点像我们现实世界当中一个人,比如说他即将离开这个世界啊,即将离开这个世界的时候啊,他还有什么事情没做的话,就可以在这个怎么着啊方法里边做一下啊就这意思。我再强调一下各位啊,现在讲的这个方法和我们之前讲的这个叫做to斯顿和equals都不一样,为什么?因为ES方法大家看见了,我是不是去手动调用ES,我tos论方法,我是不是也用引用,我用引用点的方式去调toth论,是吧,但是这个final line方法呢,是不需要你去调的,你明白吗?你只需要重写就行了。你只需要重写就可以了,我不知道大家有没有理解这个这个意思啊,就这个方法不需要你来调,我在这儿已经说了。
08:06
这个方法不需要程序员手动调用,JVM垃圾回收器负责调用这个方法。啊,不像什么呀,不像这个,呃,Equals to啊。Equals和to润方法是需要你写代码调用的。啊,只需要怎么样重写。重写完将来自动会有人啊,会有程序来调用,明白吧,自动会有谁来调啊,GCGC来调啊,GC garbage collection GC来负责调用什么呀?哎,Finalize方法。
09:01
啊,方法,喂喂啊,会去负责调这个final方法啊,那么这个final方法呢,我们可以试验一下各位啊,试验一下,比如说我们在这写public class,呃,TEST06,然后呢,Public static void。做一个测试,各位啊,简单了解一下,我们在这有个class叫做person person啊。然后接下来呢,我们person大家都知道去继继承谁object是不是它默认继承父类就是object对不对,然后呢,我们在这里怎么着啊,重写哪个方法呀,重写finalize方法哈,来,那这个方法重写的话,我们重写一下吧,就这个德行吧。对吧,那就重写一下来,拿过来放到这儿行不行,哎,那system.out.print打印输出。对吧?哎,即将被销毁啊,即将被销毁,打印一句话,那么接下来我们得把person怎么着拗出来,对,不是person p new,一个什么person。
10:07
好,这个是创建对象吧,那我问大家问题,是不是垃圾回收器必须把这个person对象回收?垃圾回收器释放这个对象的内存的时候。垃圾回收器是不是会去?调用这个方法呀。就我们只需要负责重写就行了,对吧。就是person对象是不是,哎,Person类型的对象,你想想person类型的对象。被什么被垃圾回收器回收的时候注意啊,Person这个类型的对象被垃圾回收器回收的时候。被垃圾回收器回收的时候,Person啊类型的对象被垃圾回收器回收的时候。垃圾回收器负责调用什么呀,P点什么。
11:05
P指向的对象。哎,也不能这么说啊,就当前对象就被回收了,就这意思啊,Person类型的对象被垃圾回收器回收的时候,垃圾回收器负责调用这个方法。哎,你怎么把把它变成垃圾啊,怎么把person对象。变成垃圾。P等于空行不行,各位。P一旦等于空,这个对象是不是就飘走了?P等于空是给P付了一个付了一个nu嘛,那这样的话,这个对象不就等于飘走了吗。飘走了,垃圾回收器不就把这个把这个对象回收了吗?垃圾回收在回收这个对象的时候,垃圾回收器会去调你这个对象的find方法,大家理解这个意思吗?就垃圾回收器一看呀,Person person你别走对吧,我要把你回收掉啊,来释放你内存之前咋的,垃圾回收器调一下你这个对象的什么方法呀。
12:04
哎,Find方法就是你通常在这个find方法里面,怎么有什么事没交代完的,你在这个法交代交代。这是一个特殊的时机啊,你比如说那个项目经理出了一个需求啊,说所有对象被垃圾回收的时候。都记录一下他的时间。对,你看那个项目开发中啊,项目开发中有这样的业务需求,什么需求啊,就是说所有对象在JVM中被释放的时候。啊,请记录一下释放时间。那我问你,记录这个释放时间,记录这个时间,这个代码写到哪。记录对象被释放的时间点。这个记录的代码,这个负责记录的代码写到哪里?
13:00
那答案就是什么呀,写到finalize方法中,你好好想想是不是这样的,你只要是说在这个finalize方法里边你干什么呀,大括号里边来记录一下哪年哪月哪日,几时几分几秒几毫秒。对不对,哎,几十几分几毫秒啊,然后你记一下这个时间啊,这个对象在哪个时间点被回收了,哪个时间被回收了,你只要把这个方法在这重写上就行,这个方法不需要你调啊,是由我们垃圾回收器负责调用的,你再看person p等于new person p等于空,P一旦等于空,这个对象就是垃圾,这个垃圾回收器就会回收这个对象,垃圾回收器在释放这个对象的内存的时候,这个对象的内存的时候,他会去调你这个对象上的final方法。明白什么意思了吗?啊。看同学们说了什么啊,P等于空,再拗一个给P也可以,不行啊。你再扭一个给P倒是可以,但是你new的这个person是一个全新的person,你原先的那个person已经飘走了。
14:04
啊,你在一个person是一个新的对象,哎,赋给一个变量一个内存地址啊。对,之前呢,肯定会释放掉啊,之前会释放掉,来咱们继续再往下,这个我问大家一个问题啊。有没有可能这个find不执行,有没有可能,有可能我说一下啊,我说一下是这样的,有可能,为什么?因为有可能垃圾回收器不启动。垃圾回收器,有的有的时候他觉得这个垃圾怎么弄比较比较少。就是Java中的垃圾回收器,它不是,它不是随时随刻都启动,都去,有个垃圾就回收一下,有个垃圾就回收一下,明白吧,哎。所以说这块呢,我要给大家提个醒啊,提示。Java中的垃圾Java中的垃圾回收器。这么挑剔,对,加入了垃圾会油啊,不是轻易启动的啊,不是轻易启动的,垃圾太少。
15:03
或者时间没到啊,种种条件下有可能。启动也有可能,怎么着啊,不启动。明白吗?嗯。有可能启动,也有可能不启动啊,我们去看看这个程序,看我们运气怎么样好吧。看运气怎么样啊。来Java c编译一下零六叫Java Java去运行。呃,使用或覆盖了过时的一篇。18T06。Person。看看啊,这个方法过时了吗?Deprecated过时了。大家看现在object高版本啊,JDK13里边,我还没太注意这个JDK13当中这个方法它已经怎么着。自从九,你看自从JK9开始啊,自从JK9开始啊,咱们这个就已经过时了。
16:04
不让用了是吧,不让用了啊,不让用了,过时了各位啊,过时了没关系,咱们可以测一下啊测一下。来。又开心了是吧,哎,TEST06,但是我说一下啊,JDK8现在用的最多,你别高兴啊。test06.java啊走好,编译通过了各位啊,加入运行TEST06走。没反应。看见了吗?这这行代码是不是没执行,这个代表没执行,是不是证明这个对象没有被垃圾回收器回收。没有被垃圾回收器回收。没有被垃圾回收器回收,所以我们这块应该是没有启动垃圾回收器啊,来我们再走一下。再来。
17:00
不行不行,各位怎么办呢?咱们能不能多多多造点垃圾行不行?多造点行吗?多造点垃圾他起不起。多造点啊,垃圾。For循环行吧,I等于零。I小于1000嘛,哎,佳佳行不行,你每循环一次都在这扭一个person,扭完之后给他制空,这样的话天空飘了全是气球吧,哎,等于空,马上给他制空啊,来,我们再看看这次。Java c呢,我们去编译啊,然后呢,Java去运行。还是不行是吧,来我们再来一个,再来一下啊编译运行。哎,这么强悍吗,现在。再来一个。
18:06
我的天哪。好了。现在这个JDK13啊,它这个可能对这个Java那个内存有点有有点调整啊,有点调整即将被被销毁,被销毁被销毁是吧?哎,这是当你这个垃圾数量达到一定程度之后啊,它就会启动垃圾回收器去回收,当你回收这个对象的时候,他会去调你这个方法。啊,所以大家看你看模拟的多了,你看是不是就就就就就就起来了啊,就起来这是多少啊。就是个十百千万十万百万千万一千万一个亿啊,一个亿一个亿啊,咱们整一个亿啊一个亿,接下来我们开始循环试试看怎么样啊呃,这边我们大家有没有一个this,各位这个this就是这个对象对吧,没毛病吧。
19:01
这是不是一个乘员方法?这个成员方法,这个实例方法里边是不是有this,这个this代表的是当前对象。是不是this代表当前对象啊,就这个是不是即将被回收。对吧,你拗一个嘛,你空了拗一个你空了是吧?哎,那垃圾回收机一看垃圾太多了,不行得怎么着啊,得释放掉,他一释放释放的时候,它会把这个对象给它内存给它释放掉,释放这个对象的时候啊,他会调这个对象的find方法。啊会find方法啊,会出输出这个对象的地址来,我们看看啊Java c呢去编译我们Java去运行走。我天呐,刷屏啊,看见了吗?夸夸夸夸,同学们可以看见吗?能看见吗?你们看见的是什么?你们看见的是啥?要创建一个亿的对象啊。一个亿的对象啊,你看GVM也受不了了,你看。是吧,对象地址都不一样,他拗拗一个对象啊,然后呢,释放一下释放一下,拗一个释放一下。
20:04
一个对象没了。对,即被销毁,即将被销毁啊,他得去处理这件事情,去处理这件事情啊,你看这个地址,你看地址都不一样啊。对吧,哎,地址都学你看卡卡了吧,这是卡死了吧,GM是不是有点懵啊,现在对吧,有点啊卡了卡了啊CTRLC啊结束掉我的天,我还结束不了。结束不了,老铁们。CTRLC废了。不是直播卡啦,是这个是JVM卡啦。GM卡了啊。导致我现在这个。导致现在这个打字都都有点那个啥声音都卡了是吧,卡了是吧,好终止掉。啊,现在好了吗?现在好了吗?好了,这会儿。好了是吧,行,那还有一个好主意,各位啊,还有一个好主意。
21:04
就是你可以有一个代码,有一段代码可以建议垃圾回收器启动。建议啊,注意听各位啊,注意听,就是有一段代码是可以建议启启启动垃圾回收器的啊来我们看,当然我们我问大家一个问题啊,建议归建议,他有没有可能不听话。老铁们回一个他有没有可能不听话,就有一段代码是可以建议垃圾回收器启动的。来哪段代码呢?我给大家写一下啊,建议归建议啊,他可能不听啊,System这个类里边有个GC。这个方法。注意啊,这个是建议启动垃圾回收器。明白吧,啊只是建议啊,只是建议可能不启动。也可能启动,就是启动的概率高了一些。
22:02
明白吧,启动的在就system这个类里边有个静态方法,大家看这是不是一个类名去掉的方法啊。这是个静态方法,各位啊,静态方法类名去掉的方法system.gc啊,这就可以起了。对起了啊来,我们再试一下啊,再试一下来。Java c啊编译一下我们叫T06.java然后呢,Java去运行TEST06走看运气啊走呀没起呀,那们啊不管用是不是不行你看。不行啊,现在不好使了,对吧,起不来他还是嫌太少啊,嫌还是嫌太少,嫌太少的话,那咱们就这样呗,来个for循环,Int I等于零,I小于。
23:00
小于1000,哎,佳佳这个能不能听话。啊CGC现在不好使了,在GT8里边一般他这个建议启动啊,还是呃概率比较高的啊,1000个对象看怎么样啊。来Java c编译加运行。诶,你看。起了吧,这1000是不是也起了?对吧,你要是把这个注释掉,你看。走一个Java c编译,Java运行。你看它是不是没动静了,所以C他GC是不是还是好使的呀,那没没50个吧,这if啊,I对50 I对50,求余数等于等于零的情况下,我们就起起一次这个这个能看懂吗。每当A对50求余数的时候,我们等于零的情况下,我们起一次可以吧,啊,这种概率可以啊,编译我们再去运行。呀哎哎呀,不行了,他又觉得垃圾又没啥问题了,是吧?啊没啥问题了,那现在的话就假如说十个吧。
24:07
每十个咱们起一次啊,看能不能起来边运行。不行不行啊,每五个呢,每五个啊编译去运行。哎。每两个呢?没两个,我就起一下不行吗?哎,起了。是吧?嗯,垃圾回收器啊,垃圾回收器就是大家了解一下这个发单这个不是重点啊,各位非重点啊。非重点明白吗?哎,非重点。非重点啊,非重点了解即可啊。了解即可行了,那这样的话,我们就把。嗯。这样的话,我们就相当于是把我们object里边,嗯,这个三个方法啊,一个方法叫equals,一个叫toth润,还有一个final,我们这三个方法就说了一下,那么我再次再强调一下啊,Toth和equals这两个是必须要掌握的,那final作为了解内容啊,作为了解内容这个方法呢,是垃圾回收器负责调用的这个方法啊,这个方法,然后还有上面的哈尼code和克隆这两个方法的话,我们下节课,呃,我们简单演示一下啊,咱们先休息一下。
我来说两句