00:00
那下边呢,咱们再看一下这个叫678啊,首先呢,我们来看一下第六个说,如果一个接口定义了叫default的方法,咱们是从这个JAVA8开始,咱知道呢,这个在接口中是可以定义这种叫默认方法,对吧?那如果一个接口中定义了这个默认的方法,那么我们说直接实现或者叫间接实现该接口的这个类,它的一个初始化会导致咱们这个接口呢也会被初始化。这个有同学看到以后呢,稍微有点迷糊是吧,咱们先复习刚才说的一个事儿,什么事啊说呢,咱们在初始化一个类的时候说呢,不会初始化它所实现的接口。但是现在又提到说,那当我们去初始化你这个类的时候呢,咱们咱先看后边这句话,当你去初始化这个类的时候呢,说这个类所实现的接口里边,但是要是有一个default方法呀,这个事儿就变了。那这个时候呢,我们说你这个接口就会被初始化。有点绕有点绕啊捋一捋,那如果这块呢,大家有点迷糊,你把这个视频停一下,脑子里边想一下这个事儿。
01:04
好,那下边咱们验证,咱们来验证,那回到咱们刚才说的一个场景。嗯,就比如说这个场景,我把它呢,CTRLC一下。我再重新再复制一份,我这呢写一个四。这个3.number 3.number是不是它呀,咱们调这个3.number的时候呢,咱们当前这个三呢,是肯定会被初始化的,这个三初始化我们刚才验证不会触发,是不是它所实现的一个接口的一个初始化呀,咱们这块呢,就把这个参数咱暂时呢先给它去掉了。嗯,关于咱们这里边儿的unit。嗯,因为现在咱其实不用看这个是不是加载这个事儿大家知道呢,我们通过这个参数呢,可以看这个相应的结构是不是加载对吧,但是看不了它是不是被这个初始化啊,我把它去掉了,我们现在呢把这个再跑一下。好,这时候大家会看到了,就是我们这个散的一个初始化呢,咱们会使得它的负类,包括它自己呢,做一个初始化,这都是没问题的,对吧,说现在呢,呃,我们提到了,说你这个实验的接口啊,就不会被初始化,因为这呢也没执行,但是如果咱们当前这个接口当中提供了一个方法,这个方法呢,就是这个八中提到了叫做default方法,你看我这块加一个METHOD1。
02:24
那我就写个你好。那写好了对吧,当我们写了一个default方法的时候,注意不管这个时候你掉不掉这个METHOD1,那我们都会触发它所实现的接口的一个出入法。发现了没有,来我们这个CB这个接口,你看它就初始化了。哎,太初始化了,哎,这呢是一个比较特别的一个点,大家呢,注意一下啊,就是我们要提供了一个default方法,那这时候呢,你这个时间类啊,这个时间类的一个初始化,会导致呢,你这个接口的一个初始化。
03:01
啊,这儿呢,就是说的是咱们这个事儿。嗯,说A第六个是吧,说就这个事儿,那我们这个算呢,如果还有此类的话。大家能理解这个事吧,你看我们这是散是吧,这个散呢,咱们实现这个接口叫compare b,我就简写了啊,那现在如果散还有个子类啊,散的散是吧?哎,如果呢,我们要是初始化,这个算的算,就是这个类进一个初始化,它初始化的话呢,是不是它负类也会初始化,它的负类初始化呢,它的这个负类发的是不是也要初始化,以及你这个S它所实现的这个接口,由于呢,你有deff的方法,是不是它也会初始化,所以这里边会导致很多类都会始化。包括那个father的父类是object也会初始化,对吧?哎,一系列的这个操作啊,都要注意一下,这指的是我们这个第六个点。好,那接着我们看这个第七个点说,当虚拟机呢,启动的时候,用户呢,需要指定一个要执行的主类,那包含那方法的那个类,虚音呢,会先初始化这个主类。那一方面呢,我们细菌机启动的时候呢,咱们涉及到呢,相应的这个这个比如说叫呃,这个系统类加载器,这个引导类加载器,或者呢,我们叫这个boop,这个class so是吧,就是我们最终的那个根的那个加载器,这样的几类加载器的话呢,呃,还有扩展类加载器是吧?诶刚才呃重新捋一下啊,我们前面讲加载器的话呢,就是呃引导类加载器,然后扩展类加载器,还有这个系统类加载器,包括我们自定义的类的加载器等等,对吧,那这一类加载这些加载器呢,在加载的时候,我们一开始GM在启动的时候呢,它会这个加载一个最根上的那样的一个。
04:34
类那个类的话呢,会把咱整个Java虚拟机的启动起来,那个类哎,它的一个执行加载过程,涉及到一个没有方法的调用。啊,这是一方面的事情,另外一方面呢,就是咱们自己,比如说针对于咱们这个类吧,咱们现在把它当成是一个主类啊,来进行一个测试的,对吧,比如当前这个类呢,咱要写一个main方法的话。定位方法里边我写一个hello。毫无疑问呢,我现在呢,就是去运行一下,呃,这就这点这吧,点这做运行的时候呢,我们就要调用这个酶方法,那调用酶方法我们说呀,当前你这个类也得先做加载来测试一下,咱们给它加上一个sta课呗。
05:13
输出一下,嗯,我就写上它。的哎初始化哎过程是吧,好,现在呢,我们去调用一下这个main方法。好,大家会看到这个没方法在执行之前呢,是不是也是调用了它自己的一个初始化过程啊。哎,这就没问题了是吧,那也就是说呢,我们平时呢,说程序的入口,那这个时候呢,咱们并没有主动的说去调这个方法,但是呢,这个通常我们去做这个run的时候呢,都是执行A,都是执行这个may了,那执行这may的话呢,当前这个类呢,首先也得需要做一个加载。其实这块跟咱们前面提到说调一个静态方法其实是一样的,对吧,还调的静态方法呢,是一样的,行这呢是我们说的这个第七个,这个第八个点呢,咱们这儿呢,就不给大家测了,咱了解一下啊,说明一下就行,第八个呢,主要涉及到什么呢?就是咱们涉及到JK7的时候呢,关于Java语言对于这个动态性的一个支持,对吧。
06:08
那我们这里边儿涉及到一个叫method handle这样的一个这个结构啊,Method handle呢,实际上是我们在反射里边这块呢,要遇到的一个具体的一个类。啊,你看我们这块输入一下叫method handle。OK。就它是吧,哎,是我们这个java.long李Mo这个包下的这个ma这个handle,那当我们呢,诶如果呢,去创建这个类的一个实例。哎,如果这个类的一个实例呢,哎,它对应的这个解析结果当中涉及到了叫reference get static reference put static reference static,它这个所指向的那个类,那个类呢,如果没有初始化,那我们就要把对应的那个类呢来做一个初始化。啊,就是这几个方法所指向的那个类没有初始化的话呢,需要把那个类呢做一个初始化,那这个点的话呢,咱们就不在这块呢,统一的做一个验证了。好,那刚才呢,咱们说的这八个点。
07:03
说这八点就是针对于类的主动使用的这个场景,大家呢,通过我刚才测试呢,你自己呢记一记,那同时自己呢,也可以下来做个验证,总结一下,主动使用什么意思啊,就是涉及到只要这些情况发生。我们对应的你那个类或者是接口就会去进行初始化。啊意味着呢,就是调那个C那个方法对吧,那没有调,没有调就叫做我们下边的这叫被动使用。不是主动使用,那就是被动使用,那被动使用不调不调呢,那就意味着你没有进行过显示的那个,呃,就是我们说在CR方法里边那个显示复制了对吧?OK啊行,那主动使用呢,我们就说到这儿。
我来说两句