00:00
那接下来啊,咱们看一下这个过程三,过程三呢叫做initialization叫做初始化阶段,诶初始化什么呢?哎,主要呢,就是初始化咱们当前这个类当中静态的变量。那刚才咱们在讲解注意哪个环节的时候也提到过初始化呢?是不是说在这个准备环节啊,准备环节呢,咱们涉及到是这个静态变量的一个默认赋值。哎,默认赋值,那现在的话呢,我们提的呢,是这个叫显示的一个赋值,哎,叫显示的一个赋值。好,我们看一下这个过程,说类的初始化呢,是类装载的最后一个阶段,那这个呢,主要想强调的就是我们这个过程三执行完以后,关于类的一个整个装载过程就结束了,在后面呢,就是关于一个类的使用这个过程了,就跟说你做菜一样,那前面这些呢,都是准备环节,然后最后一顿炒,然后最后呢把这个菜呢装到这个盘子里了,这个呢就算是完事了。那当然了,这个呃,就只能说是我们这个菜做做完事了,对吧,那你做菜的目的呢,是为了吃嘛,那吃的这个吃菜的过程就好比是我们这个过程四,那过程五的话呢,就相当于你最后把这个盘子不得刷一下锅呀,还有这个炒菜的这个工具啊,不也就得刷一下清理一下,这就算是这个过程五的这个过程,咱们主要加载这个类的目的呢,是为了使用,就跟你炒菜的目的呢,是为了吃菜一样,对吧?当然我们刚才说的这个初始化主要指的就是你这个炒菜的整个这个事儿呢,就做完了。
01:26
啊,是这个意思啊。好,那如果前面这个步骤啊都没有问题,那表示呢,咱们这个类呢,就可以顺利的装载到这个系统当中了,那这个时候呢,就会执行Java这个自检码,那这里边儿大家注意一个非常关键的一个事儿。啊,什么事呢,我把这个标成一个比如黄色吧。说到了这个初始化阶段,咱们才真正的开始执行类中定义的Java程序代码。诶,注意这里边儿涉及到我们要执行程序代码的,在初始化这个环节会执行一些代码。
02:01
大家呢,会想到咱们在Java程序当中啊,比如我写的这个,咱们以前是不是见过这种叫静态代码块是吧?静态代码块呢,咱们说是不是随着类的加载而执行啊,比如说我这块我就写一个叫做。呃,Father的一个static,那我写了这样的一个输出语句对吧,那这个输出语句的话呢,咱们知道这个类呢,要一加载它是不是就执行,那就是我们在这个控制台上的话,你会看到这样一个输出语句,对吧?那就相当于呢,是属于有一些字节啊码指令呢就执行了,那刚才呢,我们提到的这个输出语句呢,其实就属于咱们这个环节做的这个事儿。在这个环节做这个事儿,来具体我们看一下。因为呢,我们涉及到这个相应的代码的执行,那我们通常都有一个结构,那其实对应的也是一个方法,这个方法呢,我们称为呢,叫做呃,这个类初始化方法C这个方法咱们在上边呢,其实提到过这样一个方法,对吧,那我们再来描述一下,这个方法呢,你注意是Java编译器帮咱们自动生成的。
03:00
那是由这个Java虚拟机呢来进行的调用,嗯,不是咱们自己写的一个方法,就是如果你自己定义了一个呢,那Java虚拟呢,也不会去给你调,你自己写这个方法啊,人家调的是编译器自动帮忙生成的这个方法,那这个方法的这个呃,方法起里边这个字解码执行是吧,你执行的都是什么东西啊。这里边提到了你当前这个类中定义的静态的成员变量的显示赋值,以及呢,静态代码块里边这个语句都会被执行,那就好比是我这里边写的这句话对吧?那就会被执行,包括呢,我们这个ID呢,那这有个显示的复制一,这呢有一个显示的复制二,这些语句都会被集成在咱们的C的这个方法当中。就帮我们执行了,好,那咱们回过来呢,看一下,那比如说就针对咱们说的这个程序,我现在呢,把它做一个编译。哎,然后呢,我们接着看一下它这个结构对吧,那结构这里边呢,你看大家就会看到我们生成了对应的这个方法里边有一个叫CL in,这个in呢,咱们在前面也提到过啊,就是关于我们这个对象,其实呢,就涉及到我们这个类,任何一个类是不是都有构造器是吧?涉及到这个构造器的话呢,我们对应的有一个init的这个方法,嗯,咱们在这个相应的这个content put里边,那其实大家也能找到,比如这个c in啊,那它对应这个方法这个名字在那个常量池相应这个位置,我就不去找了,我就不去找了,就是在咱们这个自件码文件当中,是不是已经就帮我们生成了CLD的这样一个结构啊。
04:32
哎,也就这里边所提的是编译器帮咱们生成的啊。好,那生成到我们这个CR的这个方法的这个,嗯,具体的方法起里边是什么信息呢?那这里边儿我们就能看得到,那这个ID首先你看就ICONS1把这个一呢压入操作数站当中,给我们这个叫ID的这个属性啊,做了一个赋值,然后呢,又压入一个二,嗯,给咱们这个number这个属性呢,做了一个赋值,哎,这个number是不是在这嘛,然后在下边呢,这就涉及到咱们这个输出语句了,对吧。
05:04
来输入语句啊,做了一个字符串的一个执行啊,一个输出操作行,那这里边儿咱们就看到了哦,什么叫C的这个结构了。没问题对吧,哎,这个大家清楚他主要做的是什么事。啊,是由哪些结构构成的啊,就完事了,然后下边呢,大家再看说在加载一个类之前,虚拟机呢,总会试图先加载该类的负类,那因此负类的CR Internet的这个总是在子类的CR这个方法之前呢被调用,那也就是说负类的这个在这个代码块呢,也会优先以此类代码块先执行,这个呢,大家在学习张拉语言的时候呢,应该也都懂这个事儿,对吧?哎,我们对应的也有一个叫口诀。这个口诀呢,我们叫这个由父及子,嗯,静态先行。说的呢,其实就是这个意思,就是我们加载这个相应的这个类的时候,比如我们要创建当前,比如我这个叫A类,创建这个A类的一个实例的时候呢,首先要加载A类,在加载A类之前,我们首先需要加载A类的负类,比如叫B类,那加载B类之前呢,先加载B类的负类,如叫C类,那C的话呢,没有显示的一个负类,那就是object这个类。
06:12
所以呢,我们说关于,哎,我们比如说要一个。诶,一个对象是吧,这个A类型的一个对象,那你它的前提呢,我们要使用构造器,那使用构造器的前提是这个A类呢已经加载了,那A类在加载之前需要先加载BB呢,有同样道理,所以整个顺序呢,就是由父其子先加载父类,后加载此类,那从上往下依次过来。啊,静态先行,就是我们加载的时候呢,咱们涉及到静态的代码块,嗯嗯,也是静态的先执行,如果还有非静态代码块呢,在接下来你去实例化,就是这几个类都加载完以后,如果你再去造对象,涉及到一个实例的时候呢,我们这个静态的要早于非静态代码块的执行。这个大家应该都比较清楚,这个咱就这个说一下这个事儿对吧,那要是演示的话呢,这里边我就提供了一个叫sub initialization,去继承于咱们刚才这个ization,这个test,那在这里边我们写了一个further static,那把这句话CTRLC,我在这个子类这块呢,那比如说把这个呢,代码打开,把这个呢,输入语句也写上,我也写一个萨是吧。
07:17
这里边儿呢,其实我们可以通过两个角度去说,第一个角度呢,大家你会发现我们这个子继承父的时候,上来就number啊,等于四说明呢,我们使用的就是复利中已经有的这个number,从这个角度上来讲,那前提我们这块赋值的前提是什么呢?是不是你这个相应的number属性。是不是必须提前已经加载啊,那你要不加载就不能在这显示负值了,那你要是加载的话呢,那就是意味着咱们是不是一定会先加载负类吧,那你要不先加负类,先加子类,那怎么会有这个number这个变量呢?对吧?啊,一定是先加载负类了,所以我们这儿呢,就可以再接着去使用。好,那另外一个维度呢,就是我们通过这样一个输入语句,大家也能看到呢,是不是先执行的负类,后执行的词类对吧?那下边呢,我们就直接呢输出这个number,那另外呢,就是你在负类这块呢,有一个复值为二,那子类这块呢,复值为四,那结果的话呢,先执行负,后执行子,所以结果呢,也应该是后覆盖的这个四,对吧。
08:19
那知识四先执行的负类的,再执行的子类的,OK,那说的呢,就是我们强调的这个过程,行,然后下边这块呢,强调的一个问题是什么呢。就是我们什么时候会产生这个C,这个方法什么时候呢,又不会,因为这个方法呢,是编译器帮我们生成的,我们就要看一下这个什么时候就不帮我们生成了呀,对吧?哎,说的是这样一个意思。行,那我们先把这个事儿呢,先停一下。
我来说两句