00:00
那接着的话呢,咱们来看这个下边这个点,第二个呢,说当调用类的静态方法时,即当使用了字节码的invoke static这个指令的时候,那这呢,我们说就是调用你当前类的静态方法对吧?那比如说咱们还以这个order类为例吧,这个order类的话呢,咱们去生成一个静态方法。Static,这个我们写一个word method。那在这里边我们假设啊,咱写一个方法体是order的,哎,叫method的,哎这样一个方法,好,那下面呢,我们再写一个单元测试。在这里边注意我们直接呢去调用order,点这个method方法,这就相当于咱们当前类中的一个静态方法,那此时的话呢,我们说也会导致当前类的一个说话。嗯,那大家发现是不是确实呢,就执行了我们这个初始化方初始化的一个过程了,对吧?但是这个时候呢,我们来看一下关于我们这个orderder类,咱们看下它的这个结构啊,这个结构呢,其实就是还是关于还是关于这个叫CL in了,那这个时候的话呢,里边那是不是还是跟我们刚才一样,是吧,咱们这块呢,提到过这个CL in呢,是我们生成的叫类构造体方法,主要呢,由我们当前这个字段这个显示赋值,包括静态代码块赋值来构成的啊注意啊,千万要小心咱们静态方法的这个方法体,它可不会出现在这个7L1的这个方法里边。
01:31
这个别蒙了,别蒙了,这个方法的话呢,是我们主动来调的时候呢才能执行的,对吧,而我们对于这个接待代码块也好,还有这个显示复制也好,是系统呢自动的帮我们去触发的CR。啊,这个是有区别的,咱们现在呢,讨论的不就是什么时候会帮我们触发嘛,哎,那么什么时候帮我们出发,就是咱们说的这个主动使用,哎,就是主动使用好,这呢是咱们说这个第二个情况,那下边这块。说呢,当使用类或者是接口当中的静态字段的时候,哎,比如说get static或者叫put static这个情况,那这里边儿呢,专门来提到这个字段的问题,那关于这个接口这呢也放到这儿了,接口里边呢,我们说也有精彩的字段。
02:17
那当然接口里边我们这个静态方法就不提了,因为静态方法的话,那静态方法呢,属于一类特殊的方法了,是吧,再一个接口里边我们主要呢,是这个抽象方法,那关于这个第三点的话呢,那咱们这个专门的这个写一个新的一个结构,咱们来说吧,这块我把这个比较长的这个先CTRLC一下,CTRLX咱们拿走。啊,就这两点呢,咱们是在这说的对吧。嗯,这块这个注释。先等一下,咱们去新建一个,先新建一个叫active use2。哎,把刚才那个咱们粘过来。啊,回过去在。
03:00
那这样一下就可以了,对吧?行,那这呢,咱们说的是这两个点,然后呢,接下来咱们去说下边这几个点。嗯,这个的话呢,是说当使用类或者接口中的静态字段的时候,那咱们先说这个类吧。这里边儿呢,我们再去创建一个类啊,比如说我们这个class叫一个,嗯,叫个user user user吧,一个人行,这里边的话呢,我们去啊,也写一个它的静态代码块。哎,叫做user类的初始化过程,好,那说呢,我们去使用这个类的一个静态字段,这里边说final呢,要单独的来考虑,咱们再讲初始化的时候呢,其实实在这个加final这个事儿呢,确实比较恶心一些,那咱们暂时呢,比如说我先不考虑final的情况,那在我们这个user里边,咱们去生成一个静态的一个。段对吧,这个呢,为了我们调用方便啊,咱们就直接声明成public了,嗯,Static的,那我这块呢,写一个int型的,比叫number,这个质量是个一能理解对吧,然后这呢,比如我们写成这个单元测试方法。
04:18
嗯。好。然后这个时候呢,我们通过这个user啊,点我去调这个number,我去做个输出。或者你做一个重新赋值也行,通过我们这个类呢,咱们去调用它的一个静态的字段。这个时候呢,大家看一下。嗯,好,这时候呢,大家会发现是不是就调用了我们这个叫类的一个初始化呀,这个OK吧,这个应该能理解对吧,那就相当于我们去调用这个静态字段的时候呢,会会这个执行,那咱们接着在跟前面讲的代这个final呢,合在一起,大家这时候呢,要保持头脑清醒,保持通脑清醒,我这样我再重新的复制一个,我这儿呢叫NUMBER1。
05:06
我这儿呢,加上一个final。加上了啊,现在呢,我把这个number改成NUMBER1,那么问大家此时会使得我们这个user这个类做一个初始化吗?跑一下。好,大家看这个时候的话呢,我们这个结果倒是输出出来了,但是呢,是不是没有执行这个语句啊。那没有执行这个语句,就意味着咱们当前这个类就没有执行初始化。就没有正出化,为啥呢?因为我们这个user,咱们看一下它的这个,最起码这个结构在这个C这里边,你看code里边是不是就有我们这个语句的一个输出吧,那现在呢,没有输出,那不就意味着我们这个方法没有执行呗。OK吧,没有执行,包括呢,你看我们这个CR这里边也有针对我们这个number这样一个变量啊的一个赋值操作,这个也没做,那就意味着我们你这个user当前这个类呢,它其实还是一个一的问题,不是还是个零的问题,对吧,因为你没有去显示的负这个一,因为它没有执行。
06:11
这个初始化过程。这个有难度,有难度大家捋清楚,注意啊,它不行,那怎么就行了呢?你看我们再写一个,这呢相当于是咱们针对于前面说到的这个study,这个final的一个应用啊,我这呢还写成是一个final,我呢就还用in型来表示,我叫NUMBER2,怎么就行了呢?你看我叫new random。第二,我们就要next写个十。那如果前面呢,大家都脑脑袋比较清醒的话呢,这个保留一下咱们之前这个他。呃,如果之前呢,大家这个头脑也比较清醒的话呢,你这个例子呢,你就应该也能够分辨出来了,我这呢叫NUMBER2。那么问一下,就是此时这个执行这个的,呃,这个字段这个调用会使得我们这个当前类进行初始化吗。
07:02
会吗?那如果前面大家清楚的话呢,这个时候你应该能判别出来是不是会呀。你看。会对吧,那因为呢,我们在初始化环节要给他赋值嘛,那必须呢,我们就调这个CR的这个方法,那它就会调一个初始化。那所以这个时候呢,注意啊,那我们这时候呢,执行它的时候,这个结构就应该是八,你怎么呃呃,当然这个是个随机数得到是个八,那这个八的要想能够出来,一定要调用这个结构,那要调这个结构一定得有这个C2IND的方法一个执行,因为呢,这个结构呢,是不是就在咱们这个c in这里边了。RY嘛,对吧,哎,关于他的实例的一个创建啊。行,那相应的我们关于这个带这个翻译加词串这个那我就不多说了啊,不多说了,咱们这还有一个事儿是关于这个接口的问题,说呢,接口中的这个静态字段啊,也有这样的一个场景,那这个咱们怎么去做一个模拟呢?接口对吧。那接口的话呢,比如我们这呢,叫interface啊,我写一个比如说叫compare a。
08:06
Compare a,咱们怎么证明这个接口也进行了一个初始化呢?嗯,因为咱们说了,你看这个类呢,你要说初始化咱们写一个静态代码块,那当然在咱们这个接口里边,是不是不让咱们写这个静态代码块啊?这个能理解对吧,那咱们就先写一个字段吧,它的所有的这个属性的话呢,咱们讲字段更合适啊,老师说习惯了叫属性字段对吧,Field,那它都是一个public static。那static是不是的呀。嗯,一个final的啊,那这时候就看到了,哇,它竟然全是select一个final的这个字段,对吧,那这时候呢,我们去in一个啊叫NUMBER1吧,这是一个一来问大家,如果你看啊,我这样写。Public test2如果呢,我们现在呢,就直接这样啊,我就compare a.number一点输出,那问一下大家,你觉得这个时候呢,我们要是去执行,会使得咱们这个compare a做一个初始化吗?
09:15
注意,这是我说的是初始化,我说的不是说加载。注意啊,咱们说的是这个环节加载的话呢,实际上呢,包括咱们刚才呢,你做这个事儿的时候,其实也是会加载的,你不加载你怎么会去叫它呢,对吧,那一定会加载,只不过呢没有初始化,这要注意。在这个环节我们会吗?大家可能会说,那那也看不出来呀,是吧,你加载了还是不加载,又不像我们说一个类这块,咱们有一个静态代码块,有个输入语句,那一看就知道了,是吧,那这时候我们怎么去看呢。嗯,那这时候大家得发挥这个聪明才智了啊,我呢想了一个招儿啊,我想了一个这样一个招,大家你看是不是比较巧妙,Public,我写一个static啊,你不都是final的嘛,其实这个三个修饰,我们写不写都可以啊,因为你不写他也在我这呢造一个TH,当然你造个别的类呢也可以,只要它能够创建这个实例就行,我这儿呢。
10:11
相当于是创建了一个thread,一个匿名词类的一个对象,在这里边我想去写一个代码框啊,我就想写一个输入语句啊叫啊compare a的初始化。我就写了一个这样的一句话。那大家你看能不能理解这个事儿啊,注意我们现在呢,是不是有一个,哎,这其实是我们既然能够重写了,那相当于这呢,可以理解成就是thread类,我们提供了一个它匿名的一个子类的这个实例,对吧,这里边呢写了一个代码块,代码块呢它是会执行的。就是你要是真正调用我们这个结构了,它就会自动执行,对吧,准确的应该这样说,那现在的话呢,我们能够确定的一个点是什么呢?这个大家呢,注意听这块有难度。哎,我先呢编译了一下,把咱们当前这个compare a呢,大家看一眼。
11:04
这咱们看的是这个compare。嗯,Compare a没问题是吧,那这个COMPARE1的话呢,看一下它这个C。打开它这个code,但是这里边呢,会看到关于我们这个compare a它的一个内部类,其实就是关于我们这个匿名的TH的这个子类啊,它的一个实例,对吧,关于他这个T,那这个T不就我们这个T吗?也就是说什么呀,咱们现在想验证一下你这个compare a有没有初始化。是不是呢,就相当于验证它是不是调这个C21的这个方法了呀。那有没有调这个方法呢?就看这个代码有没有执行,如果这个代码执行了,那就意味着我们创建了这个对象,创建这个对象就会执行这个语句,所以结论就是如果我们这句话输出了。相当于我们这个接口就初始化了。脑袋能跟上吧。哎,如果能跟上的话呢,咱们就可以往下走了,我现在的话呢,写了一个叫NUMBER1等于一,我写到这儿了是吧,那此时的话呢,我们做一个执行。
12:08
好,大家会发现呢,是不是没有输出啊,那就意味着这个时候呢,实际上就没有去调用我们这个接口的一个出入法。哎哟,那你怎么就掉了呢,那咱们上面是不是还说了一个这个事儿啊,CTRLC一下拿过来这个呢,我改成叫NUMBER2。好,这个时候呢,我把这个NUMBER1,我改成叫NUMBER2啊,它那一注释。改成二。我们现在呢,想去调一下这个NUMBER2啊,这个NUMBER2的话呢,你看我是这样写的。哎,有区别,来咱们跑一下。好,是不是看到点东西啊,那这个时候呢,我们取了一个随机数,这个随机数呢,只不过恰好是零了,但是这时候呢,我们就看到了这样的一句话的执行,呃,这句话对吧?这句话的执行呢,那就意味着咱们相当于是执行了它,那它在哪执行的,不就是在我们这个C里边执行的吗?不就意味着咱们这个接口做了一个初始化吗。
13:10
哎,这个当我这样设计完之后呢,我觉得我还挺聪明的是吧,哎,这个呢,我们通过这样的方式,大家呢,可以做个见证。好,这个呢,就咱们说这个第三个点说使用类或者接口这个静态字段的时候,这个因为一两句话说不清楚啊,有的这个书上说说final的这除外,这个final除外,其实准确来讲不对,像咱们现在的话呢,咱不是调的也是个final嘛,或者说接口中那不都是final的吗?这个字段的话,但是的话呢,这不是照样也会触发他的一个初始法,对吧?关键呢,就是看你怎么看待这个事儿。那那这个final跟static搭配,咱们在前边儿重点呢,也讲了这个难题攻克之后,那这块呢,大家也就能搞得定好,这呢是我们说的这个第三个场景。
我来说两句