00:00
好,那我们类加载子系统这个章节呢,除了前面我们介绍的内容之外呢,最后还有一点补充内容呢,给大家说一下,那我们就列到了一节叫做其他,诶我们看一下分别有哪几个问题啊,这里边提到了说在GMGM当中我们表示两个class对象是否为同一个类啊,存在的这个必要条件是什么?诶得明白哈,两个class对象,也就是说我们加载到内存中,比如说有两个这个运行实类了,是吧,因为大的class它的对象呢,对应的是两个加载到内存中的两个类啊说你这两个类呢,是不是同一个类啊,诶有什么必要条件呢?我们说要求呢,这两个类的,诶完整的类名必须是一致的,哎包括包名,尤其注意啊,包括包名就是你定义一个类叫做诶string,我也叫string,咱俩的包名得一样,哎这是其中的一个必要条件,从这一个条件上来看,比如我们现在定义的这个诶string是Java点浪爆下的这个string,那和和我们系统提供的字符串,诶Java点浪漫下的词缀呢,诶从第一个条件来看,目前他们还算是同一个。
01:06
但是呢,我们这块还有第二个条件说加载这个类的class loader啊,要求也必须是相同的,诶这个呢,如果加上以后,我们说呀,咱自定义的这个string和系统给我们提供好的这个string呢,就不是同一个了。那就不是同一个了,因为二者呢,使用的类的加载器,诶不相同了,那下边呢,这不又介绍了一下啊,即使呢,我们内存中的两个类,它来源于同一个,即使啊,你看即使它来源于同一个class文件。感觉上就是同一个类了,对吧,但是呢,如果说呢,你使用的类的加载器还不一样,那也认为这两个对象不相等啊,相当于把我们这种情况呢,又说了一下,就是你认为这两个大的实例一样,就是不管它的类是同类文件是同一个,而且呢,要求呃类的加载器也必须得是一致的啊,这个大家要记住它啊。好,然后呢,我们来看一下这个第二问题说对类加载器的一个引用,诶GM呢,必须知道一个类型是由启动类加载器还是由用户类加载器加载的啊,这个很正常啊,这个我们通过你这个类呢去调get class loader就能够清楚。
02:15
那如果一个类型是由用户类加载器所加载的,那么GM呢,就会将这个类加载器的一个引用作为类型信息的一部分保存在方法区当中。呃,就是我们说呃将这个呃这解码文件加载到内存中呢,我们是放在方法区呢进行保存的,那么方法区当中呢,还记录了你当前这个类的使用的这个类的加载器啊,如果你要是用户类加载器,说白了就是不是启动类加载器的话呢,我们都会记录一下。啊,因为行为加载器它本身就是个nu嘛,啊,就不去记录了啊,那下一个呢,就是当解析一个类型到另一个类型引用的时候,哎,GM呢,需要保证这两个类型的类的加载器是相同的。哎,要保证这个事情,这个事情呢,大家现在可能不太好理解,后面呢,咱们会讲到这个动态链接,诶在动态链接里边我们就需要这个信息,所以我们要保证它是相同的啊,对这个GM区分这个名字空间呢,这个方式是至关重要的啊,所以这块呢,大家关注一下这个问题,后边呢,咱们具体来讲这个事情啊,然后呢,下边我们再说明一下什么呢?诶Java程序当中,咱们呢,要使用这个类,那对雷的使用呢,分成了主动使用和被动使用两种方式。
03:30
诶,主动的我们要加载一个类,还有被动的要加载一个类啊,那么主动加载的话呢,一共有下边的七种情况,那除了这七种情况呢,剩下情况都称为叫被动使用,被动使用跟主动使用的区别是什么呢?不都是使用吗?区别呢,就是一个是主动,一个是被痛是吧?啊好像跟没说一样哈,哎,区别呢就在于会不会导致类的初始化。啊,会不会导致类的初始化,初始化什么意思呢?咱们前面不是讲了一共呃类加载过来的话呢,分成三个阶段嘛,呃,这个呢叫加载阶段,这叫链接阶段,呃这个呢叫初始化阶段,而且呢,你看大家我这做的这个课件呢,确实花了很多的时间啊,你看我还是很细致的,你看这个加载呢,第一个阶段颜色呢,淡一点颜色依次递近是吧,最后颜色最深,你发现了吗?
04:23
我感觉我都有点被感动了哈,我自己做的啊,那么呃,在这个环节我们称为叫初始化是吧?呃,就是说当你要是被动使用的话,被动使用呢,首先会加载,因为你毕竟使用了嘛,你一旦使用呢,我们就需要把你加载到内存当中了,但是呢,会不会在初始化的时候呢,去调用你这个,呃,CL内的这个方法,这不一定啊。因为我们调用那个方法就会涉及到静态的,比如说属性,呃,这个静态的代码块它的一个执行了啊,你要是静态的属性会有一个显示赋值啊,尤其是这个静态代码块到底执不执行,就看人家是不是执行过这个初始化,所以呢,主动使用被动使用的区别就在于这个操作呢,是不是执行了,那么主动使用都有哪些呢?我们简单说一下啊。
05:12
我们在创建这个类的实例的时候,造对象,那就要主动使用,然后呢,访问这个类的,呃,或者是接口中的静态变量的时候啊,我们这时候呢,称为叫主动使用,然后调用它的静态方法,通过反射呢,主动加载它初始化这个类的子类,哎,我们在前面也提到过,加载这个一个类的时候呢,这个类的负类呢,是首先要被初始化的。啊,所以说当你要是初始化它的子类的话呢,这个父类呢,也需要呢,呃,进行一个主动使用初始化。然后Java虚拟机呢,启动的时候被标明启动类的类啊,启动类类的我们需要主动的来加载啊,以及呢,JDK7提供了这个动态语言的一个支持,诶提到了这样的一些具体的操作了,行,那这块呢,咱们先不详细的展开来说,后面呢,咱们还会讲这个字解码跟类的加载,详细的咱们是在这个第二篇呃当中给大家去讲的,所以暂时呢,大家先有这样的一个印象就行,到时候呢,咱们在一个一个的给大家做一个验证啊就可以了,行,那整个呢,我们说关于哎,咱们还来看这个图哈。
06:17
关于这个类的加载,咱们把第一部分类加载器子系统这呢就介绍完毕了,呃,详细点看的话呢,大家就看这个图,那看到这个图的话呢,基本上这里边儿的一些细节点,包括呢,比这个还多的一些内容,大家应该能够回忆起来就行,那么从下一张开始,咱们就开始主要来讲解,呃,运行时数据区啊,这块内容呢,相对来讲要多一些啊。好。
我来说两句