00:00
那接着的话呢,我们再来看一下这个第四个场景,那咱们把这几个呢,CTRLX,嗯,我接着再拿走,咱们再去新建一个。啊,Active use,嗯,该删了对吧。行,那这里边呢,咱们说的都是关于这个类的主动使用啊,当然了,只要看到这个名字你就知道了,咱们就依次往下顺着说,那下边呢,我们来说一下这个第四个说,当使用flag reflect这个包下的方法,这个反射类的,呃,反射类的方法时,嗯,比如这块呢,主要就涉及到我们关于这个类的主动加载。这个呢,你看主我们刚才说了叫主动加载class.for name跟我们class.class是有区别的,这个咱们讲到下一章的时候呢,给大家呢做一个对比,那此时呢,咱们使用的这个主动加载,那比如我们这块呢,直接就来一个单元测试。TEST1。
01:01
这样子对吧,那刚才呢,我们写这个第一个程序的时候呢,这里边不是有一个order吗?这个order呢,咱们有一个静态代码块,那咱们就直接呢加载它得了,那点右键这块有一个叫copy reference啊,复制一下它这个索引回过来,在这呢,我们通过这个class.for name啊,把我们刚才这个全类名呢放进去,主动的去加载一个类。啊,那我们就生成了一个大的class的一个实例。对吧,那这样子他这块有异常,咱们把这个异常呢,给他这个try catch一下。啊,这用不着翻了,嗯,完事了,那现在呢,我们把它呢执行一下。OK,那我们主动的去加载一个类的时候呢,我们会发现呢,这个order类的一个除化过程,他也执行,相当于这呢,也算是一个叫主动的一个使用,OK对吧?那咱们再接着往下看第五个,那第五个这块又稍微麻烦一点说呢,当初始化子类的时候,如果发现其父类呢,还没有进行初始化。
02:04
那则需要呢,先触发其负类的一个初始化。再说一遍初始化子类的时候呢,我们先要触发它父类的一个初始化,这个其实咱们前面也提到过,由父即子,静态先行,对吧?好,那咱咱们来验证一下这个场景。在当年这个问题下呢,我们去来一组这个子父类,比如我这呢,就叫做一个father啊,Static。哎,输出语句叫father类的一个初始化过程。行,那接下来我们再创建一个类,这个呢,比如我就叫做son,让它呢去继承于father。那这呢,我们改成三,哎这就可以了,对吧,那我们如果呢,去触发这个子类的一个这个初始化的这个这个初始化的时候呢,说这个负类呢,诶也要先做一个初始化。
03:02
Public avoid test2,那我们这个sun那个初始化呢,这个怎么都可以,咱们上面不是讲了好几种场景吗?那比如说呢,我们这里边写一个字段,比如public static,咱们刚才讲过的in型的一个number,比如复制为一个一对吧,那现在的话呢,我就直接上点number.s那这样的场景是不是就会触发我们对于这个sun这个类的一个。呃,初始化对吧,但是他在初始化之前呢,它一定会触发father这个类的一个初始化好跑一下。好大家会看到了,那首先呢,会先来初始化咱们这个father类,然后呢,再触发咱们这个散这个类,那接着呢,是你这个一的一个输出。OK的对吧,当然这里边儿我们还要强调一个点什么呀,我们这个father类是不是他也有负类呀,它也有负类。那就是相当于在加载它之前,是不是我们说应该先要加载它的负类叫object啊,那object类也会进行一个初始化的,对吧。
04:06
哎,那这里边儿呢,咱们其实可以借用一个,嗯,参数啊,我这里边儿写了一个这样的一个参数。啊,这个trace class loading啊,关于这样一个参数,这个参数呢,就可以追踪一下我们这个类的一个加载信息啊,它可以追踪这个类的一个加载信息,那怎么加呢?咱们这是一个单元测试方法,对吧?大家可以在我们这个是不是咱们前面的加参数都是在这加吧。咱们现在用的是单元测试方法,那你找到下边这个template,找一下这个叫unit,嗯,在这呢,把这个参数呢给它加上。好,这块我们点一个play啊,OK一下,好,那此时呢,咱们把这个呢,再做一个执行。来执行了,执行以后的话呢,下边这个比较多,CTRLC一下,咱们把它粘出来看一下这里边儿这个信息。嗯,粘到一个TXT里面。
05:02
嗯,CLV过来,好,那刚才呢,你看咱们看到了是不是这样的三个本来是我们要执行输出的话,就是他们仨对吧,他们仨在上面的话呢,你看这个是关于我们说这个类的一个加载。就是加载的话呢,这块诶看到了这个sun加载了,是不是也看到我们这个father类加载了,然后大家呢,要往上找的话呢,其实是可以找到我们这个object这个类的一个加载的。那我们直接呢,CTRLF搜索一下Java,点浪包下的object对吧,然后做一个find。那在这就找到了,那我们是不是先要加载一下这个object对吧,那就是相当于在我们加载这个发这就按照这个顺序从上往下走,走走走走走啊,这个你看还挺长的啊,一直走到下边这块,才把咱们这个发这个类呢做了一个加载,加载它之前呢,它的负类呢,Object是一定要先加载的。OK,注意这块呢,我们看到的是叫加载,这个看到的可不意味着说我们这就一定会初始化啊,这个是叫加载初始化呢,是咱们通过这个静态代码框,咱们里边这个输出语句,咱们做了一个验证啊,这个大家清楚一下。
06:08
好,这个我们就把它关掉了,那回过来。过来,接着往下看。那先触发其负类这个出入号,这呢是不是就完事了,然后关于这个第五个点啊,咱这块呢,多说两句。嗯,大家你看一下,我这写了一个五的一个补充,就是负类这块呢搞定了,但是这个类呢,是不是可能还要实现接口啊,那关于实验的接口这块是什么情况呢?大家来看说,当Java虚拟机初始化一个类的时候呢,要求它的所有负类呢都已经初始化了,咱们刚才也说过了,但是这条规则呢,并不适合于接口,什么意思啊,在初始化一个类的时候,并不会先初始化它所实现的接口。这个接口呢,是不会初始化的,来先把这个点这个咱们把这个补充的也整个给他。哎,这样CTRLC一下。等到这哎,我粘过来行,咱把这个呢,说明给大家强调一下,比如说呢,咱们现在呢,是不是这个散对吧,我下边呢,给大家去提供这个接口。
07:09
啊,Interface,比如我这写个B。嗯,这儿写个接口,刚才呢,咱们已经有相关的一些这个经验了,我是怎么处理的呢?是不在我们这个里边写一个这个结构啊,那我这也同样道理,CTRLC一下。来,把它关掉。嗯,这个。粘过来这个呢叫compare b,它的一个初始化挑选格式,行,这个呢接口我就写到这儿了,然后呢,我们让咱当前的这个散继承于发的同时去implement一下这个接口。OK吧,那实现下这个接口好,那当我们刚才呢,也看到这个语句执行,在这个语句执行的时候呢,我们散和这个father啊,他们俩都会初始化,那我们关键就看一下这个语句有没有出来,这个要出来了,那说明这个接口呢,也就初始化了,没出来那就是没有初始化呗,跑一下。
08:02
跑一下看跑一下呢,这块这个挺多的啊,Ctrl a ctrl c,咱们把它粘出来再粘到这吧。Ctrl a,咱们把它删掉,CTRLV一下。回来之后呢,这时候大家你会发现,你看我们这句话。这呢,我们就要compare b的一个。初始化对吧,咱们把这句话呢,CTRLC一下,咱在这里边呢,做一个find ctrl v find,你看找不到,那说明呢,就没有输出,这句话没有输出,那这时候我们把这个compare b我翻了一下,大家会发现是不是能找到啊,这什么意思啊,就是说呢,我们这个compare b这个接口啊,它确实是加载了。注意加载呢,我们现在指的是这个过程啊,这个loading的这个过程加载了,但是呢,这个接口没有初始化。那接口没有初始化,因为咱们没有看到那个输出语句嘛。就是这个问题。行这呢,就咱们说的这个事儿,那初始化一个类的时候呢,不会初始化它所实现的接口,下边呢,又一个在初始化一个接口的时候呢,不会先初始化它的负接口。
09:07
是吧,就是接口跟接口之间呢,是继承关系,那类呢,是初始化一个类,它会先初始化它的负类,那初始化一个接口还会初始化它的负接口吗?这个注意也不会。啊,这个呢,咱们要验证一下的话呢,也可以,那咱就再接着整一套呗,我这块把它呢CTRLC复制一下。这个我叫一个C吧。啊,我让这个C呢去extend。哎,Compare这个B。可以了,这呢我写一个C对吧,那怎么呢,我们能触发这个接口的一个初始化呢,咱们刚才那会儿是不是也提到过public。那带这个final,这个其实不写它也默认有对吧,那int类型的NUMBER1啊,写成个大写吧,等于我们用一个random。第二,Next一下。我这样写的OK行吧,然后下边呢,我们再写一个单独的测试。
10:05
Test一个三行,那这时候呢,我们通过这个compare c啊,我去调一下这个NUMBER1。那那一我们把它输出一下,那跑一下这个时候呢,先确定一下,确定一下我们这个compare c呢,它会不会做一个主化呢。好出来了啊,这个太长了,我们往下拽,直接这时候呢,我们会发现是不是这个compare c的初始化,它这个就输出了,它输出呢,其实就意味着咱们。这个CC呢,它做了一个初始化,那那这块关键就是我们在这里边去找一下这个CB,它这个语句有没有输出就行,对吧,Ctrl a ctrl c再过来ctrl a把它都删掉,CTRLV一下粘过来,咱们想判断一下,哎,咱们顺便把这个也验证一下,比如说其实已经看到了是吧,CTRLFCTRLV,然后呢,Find,哎,这不就找到它了,然后把这个C呢,咱改成是B。
11:01
然后再放的还没找到,那就说明啊,咱们这个负接口,在我们这个子接口进行一个。初始化的时候呢,这个负接口是不会跟着初始化的。啊,这解释的就是咱们说的这个问题,嗯,这个注意一下说,因此呢,一个负接口并不会因为它的子接口或者实现类的初始化而初始化。哎,这分别的一个是实验类,一个呢是磁接口,只有当程序首次使用特定接口的静态字段的时候呢,才会导致该接口的一个除法,就像咱们刚才说的这个场景一样。行,这呢是咱们说的这个,哎,到哪个点了,是不是到五这儿了,哎,下边还剩这个678。
我来说两句