00:00
那上午呢,咱们最后那是提到了一个大的class实例的一个获取,诶这块呢,大家一定记住一个事儿,就这个大的class的话,诶我们说它对应着一个运行实例的对象,哎就是这样的这个一句话啊,诶对应着一个运行实类的对象,这个运行实类这块这个类呢,咱们又扩展一下说呢,啊不光是一个类了,其实很多结构呢都可以,哎这块呢,提到有这样些结构,哎只要它加载当内存以后,都看作对应着一个大的class的一个实例了,哎那接下来呢,我们再往后讲,那么既然呢,我们现在占空间,有一个理解成占空间啊,我有一个叫C1对应的呢,就是这长时object了,呃在这个其实是在这个方法区啊帮我们把这个类呢,整个就加载过来了,加载过来以后,你这个类里边呢,我们说不管是object类也好,还是咱们定义的其他的类也好,咱就只以类去举例子,那类里边呢,就会有属性,就会有方法,哎构造器,还有其他的一些结构,那既然呢,每一个类都会有这样的几个部分,那我们通过这个CE呢,指向了以后。
01:00
接下来我们就可以调用这个大的class类当中的一些方法对,比如说我想调啊,我想找指定的某一个属性,比如叫哪个名的属性,诶就找到了,找到以后我们再就可以去调这个属性来进行一些赋值啊,获取啊等等,这样操作方法呢,也类似构造器呢也如此。呃,这个构造器的话呢,即使它是个私有的,但是呢,只要你有构造器,我这呢就可以通过方法呢,诶可以去调用你,因为你毕竟呢在我们内存中加载吧,那既然加载了我这块呢,就可以考虑去进行访问,诶就是这样一个情况啊行,那么我们先不着急呢去做下边这个事情,调这个属性方法或构造器呢,咱们先来看一看,诶刚才提到了说把这个内存呢加载到把这个运行类呢,加载到内存以后,就对应着我们大class一个实例,下边呢,我们诶稍微呢了解一下关于类的一个加载过程,诶这个内容呢,大家作为一个了解就行啊哎,我讲一讲,大家听一听,知道这样一个流程就可以了,说呢,当程序主动使用某个类的时候呢,如果这个类还没有加载到内存当中。
02:06
那咱们系统呢,就会通过如下的三个步骤,对这个类呢进行一个初始化。啊,进行一个初始化,那具体来讲啊,我们说这个类的加载过程呢,分成这样的三个过程,第一个呢,叫类的一个加载load的过程,第二呢叫类的链接link,第三叫类的初始化。诶准确来说呢,是有这样的三个步骤,那这三个步骤合在一起呢,有时候我们又泛泛的称作叫类加载了,所以你要细讲的话呢,类加载又又看作是这个过程当中的第一步骤。哎,但是整体来讲都称作叫类的一个加载过程,那么在第一步呢,叫类的加载,它做什么事了呢?就比如说咱们说的这个person类,Person类P类在第一个环节叫类的加载,首先呢,我们需要把这个自检码文件,先是物理上存在的一个自解码文件,通过咱们这个叫Java,有Java点这个exe这个指令,诶给它呢,加载到内存里边,第一个步骤做了这样的事儿,将类的自解码文件读入内存,并为之创建一个诶大的class的一个实例了,诶,该过程有类的加载器完成,相当于我们这个第一环节就对应着有一个大的class了。
03:16
这是第一个步骤,那么第二个呢,叫做类的链接,说将类的二进制数据呢合并到GRE当中,第三个呢叫类的初始化,负责呢对类进行初始化,这个呢写的稍微抽象一点啊哎,那下边呢,有一个具体的一个描述。啊,具体的描述,比如说在第二个环节呢,叫类的链接这块会提到对我们这个类当中声明为像static静态的这样一些变量呢,进行一个值的设置,但是这个值呢,注意是默认初始化值。诶是默认初始化值啊,比如说我们是定义了一个叫static int类型的一个变量吧,比如叫N,那此时的话呢,在我们这个链接环节只会给这个N赋值为零。
04:01
哎,值会赋值为零,这呢是在链接环节,在初始化环节,这呢才会给我们这个N,如果啊,你在定义的时候,这个N呢,你显示负了一个值是二,是在初始化环节的时候呢,把这个二覆盖了原来的零。或者说呢,你在这个呃,静态代码块当中,咱们说呢,静态代码块也可以去操作这个静态的这个属性了,呃,在静态代码块里边,你复制为三好,那就是这个三呢,再去覆盖我们这个默认初始化值,你要是先有一个显示,又有一个静态,咱们当时讲赋值的时候说过是不是就看谁先写谁后写了。啊,就是显示复制先写的,那就是它先赋值,静态的后写,那由它后复值,你要反过来呢,那就是这个顺序得颠倒一下啊,那么刚才说的这个显示赋值和静态代码块中复制这个事儿是在初始化这个环节中做的,这里边提到一个叫类构造器方法。类构造器方法,注意这个呢,不是咱们所说的啊,这个类中的构造器啊,是另外一个类构造器啊,它这呢提到类构造器方法,它是由编译器自动收集类中所有类变量的复制动作和静态代码块中的语句合并产生的啊,这个呢,不是咱们说造对象的那个构造器,这要注意,那么这个类构造器方法帮我们做什么事呢?就是将我们把这些这个静态的一些结构,如果你有显示值啊等等做一个初始化。
05:28
啊,下边又提到了这个啊,因为呢,就就是我们在使用这个类的时候,如果这个类呢,发现它的负类呢,还没有初始化,咱们要先触发其负类的初始化。这不是咱们讲面向对象的时候,其实说过这个事儿啊,咱们在使用一个子类的时候呢,是不是先要加载它的负类啊,哎,说的就是这个问题,然后再下一个说虚拟机呢,会保证一个类的这个构造器方法呢,在多线程的环境中,这个正确加锁和同步就是它相当于是个共享的了,哎,我们保证呢,就执行一次就行啊,别让多个线程的都过来去执行,它就乱了啊,哎,我们这是一个同步的一个效果。
06:03
成那简单的我们看一个例子,简单看一个例子啊,比如说大家看这我们这有个class a class a呢,你看我这是个静态代码块,这呢是一个呃,生明那个静态的一个变量啊。第一步,第一步呢,我们叫这个类的加载,那就相当于把我们这个大的A呢,就加载到内存当中,对应着有一个大的class的一个实例了,啊,大的class比如叫C了,就对应着我们这个方法区当中,啊,我把这个大A呢就加载过来了,然后在我们第二步呢叫链接,链接的时候呢,涉及到这样的一个静态的变量叫M啊,这个M先复制为零,这呢是我们链接步骤做的,第三步叫初始化,由我们这个构造器方法来完成,构造器方法的话呢,看到呃,你呢先写的静态代码块,后写的这个显示值100,所以呢,我会先给你复制为300,再复制为100。啊,这呢是我们第三步做的,所以呢,当我们在这去输出的时候呢,这个结果是多少,100呗,哎是100,咱们当初讲这个属性赋值的时候呢,说过好几个位置啊,哎当时也提过说这个代码块跟这个显示赋值,就是看谁先写谁后写了,哎那谁先写谁就先执行,这呢如果我们颠倒一下啊,你把这个结构跟我们下边这个要颠倒,是不是就成300了。
07:20
对,就是这两呢,相当于颠倒了一下行,这呢,就咱们说这个叫呃类的加载器啊,就是类的一个加载过程啊,加载过程,呃,这个加载过程刚才呢,就提了一下是这样的三步,大家了解一下。
我来说两句