00:00
行,那讲完前面这个问题之后呢,咱们再来看一个细节问题,叫做静态变量与局部变量的一个对比啊,可能猛一看大家有点懵哈,说静态变量跟局部变量的对比,诶还得反映一下,说这个变量是咋分类的是吧,咱们稍微的这个复习一下啊,这个我就写到这个位置吧,诶稍微的复习一下这个变量,诶它的这个分类,诶我们说有两种分类方式啊,第一种呢,是按照数据类型分。呃,数据类型分呢,我们分成两类,第一类呢,叫做基本数据类型。呃,第二类呢,叫做引用数据类型。呃,Java这个变量的这个分类呢,自始至终呢,就这两种,呃不是说就这两种,就是就这两种主要的,而且没有一些这个随着版本的迭代更新呢,有变化的这个讲究哈,像这个GS当中这个不同的ES版本呢,它还有一些不同的这个情况,呃,大家可能得多关注一下哈,这呢是它的这种分类方式,也可以呢,按照呃在类中声明的位置来分,呃那这样分的话呢,我们也可以说分成两种,那第一种呢,叫做成员变量。
01:11
哎,第二种呢,我们叫做局变量。诶就分成这样的,那么关于这个成员变量呢,我们说它呢又可以分成两种,一种呢,就是使用静态来修饰的,一种是没有修饰,修饰的话呢,我们称为叫类变量,或者也叫做静态变量,那么没有被static修饰的话呢,我们称为叫实例变量。诶叫实例变量。因为呢,它归具体的对应对象所有,所以我们就可以称为叫实例变量啊,是这个意思啊,行,那么咱们现在呢,要讲的是谁呢?说这个类变量和我们这个局部变量,它俩之间有什么区别,哎,这个你清楚啊,是这俩之间的一个对比,行呃,那这呢,我们想说明的问题是什么呢?咱们这个类变量,咱们这个类变量包括这个实例变量哈,那这说白了,那就是成现变量呗,这个成现变量呢,我们说它是有默认初始化值的啊,这个在使用时。
02:14
啊,或者在使用前啊,我们说都经历过。哎,叫默认初始化赋值,都经历过这样的一个过程,那也就是说呢,像咱们这个类变量,哎,当然我这个程序中没有写类变量啊,咱们前面已经讲到过了,像这个类变量的话呢,咱们在讲类的加载的时候呢,提到过类变量的一个初始化,大家回忆一下,咱们在说到第二个环节叫做linking链接。这叫链接了的,呃,内部有一个叫叫准备阶段,我们说呢,给类变量默认赋值。这个大家应该还记得,如果你不记得了,你就再翻一下我们前面讲的这个视频,那给裂变呢,有一个默认赋值,然后接着呢,是在我们这个initialization。
03:07
啊,我就写initial了啊,在这个阶段,那给我们这个类变量呢,显示负值。嗯,类变量要显示赋值及呃这个静态代码块赋值。哎,如果你要是有静态代码块的话,那就赋值行,那么这是我们说的一个类变量,总之呢,我们这里边出现过这个叫默认赋值的这样一个过程,对吧?嗯,然后呢,咱们这个实例变量,这个实例变量的话呢,它也在使用之前呢,会不会有一个默认复制,那实例变量什么时候出现呢?我们说这个随着啊对象的创建。这个我们说会在堆空间中,哎分配哎这个实例变量空间。哎,并进行默认赋值,那既然有这个默认赋值的话呢,就意味着我们不管是类变量也好,实例变量也好,如果大家没有显示赋值,像你这个实例,呃,这个类变量没有显示赋值,就一定是来ization这个阶段你就不用给他操作了,直接呢用这个默认值就可以了,那实例变量呢,就是你逆完对象以后没有显示赋值,那也可以用它的默认值,总之呢,它们有默认值,那对于这个局部变量,咱们想强调的就是诶,在使用前是必须要进行显示赋值的。
04:31
哎,这个否则呢,啊,这个编译不通过。那就是这个意思,那这个大家其实都知道这个事儿啊,简单写一个方法,比如public,我们写个TEST5啊,这是一个临时的一个。行,那这个方法里边,比如我们就定一个int型的一个number,这个呢,我就不给他赋值了,直接我们去打印一下这个number,或者呢,你这个number上面做一个加加,哎等等,那这样的操作的话呢,你看他都会写说你这个变量呢,说还没有进行一个初始化啊,这我们粘一下啊这个错误信息。
05:10
哎,说明这个,哎哟,这个没粘过来。再不让我扎。And for。CTRLV粘不过来啊,那算了,就是说错误信息呢,就是变量我写中文了。变量这个number啊为进行初始化,哎,这就错误了,那就对于我们这个局部变量来说,大家你想一想,咱们每一个方法呢,都对应着一个战帧,这呢是一个站这儿呢,就是我们比如说这个叫TEMP5这个呃T5TEMP这样一个方法,诶然后呢,在这里边我们有一个部分呢,叫做局部变量表,这个局部变量表呢,目前来看问一下有几个变量呢。应该有两个对吧?诶第一个呢,就是我们说的这个Z啊,它是占于这个SLOT0的位置,然后呢,还有一下我们这个叫诶number,但是这个number的话呢,你注意它呢,是一个变量,这个变量我们说数组里边要存储它的值,那这个值呢,咱们说对于局部变量呢,不会给它有默认赋值,必须要显示给它赋个值,那否则的话呢,你这个数组当中就没有数据了,那它就编译不通过了,那数组里边没数据,没初始化可不行,对吧?所以这个呢,我们把它注释一下,需要注意这个问题啊,纠变量必须要显示赋值,否则呢无法使用。
06:32
啊,OK,这就结束了啊,这呢,就我们说的这样的一个对比行,那么关于我们这个局部变量表呢,最后再强调一个问题哈,呃,这个因为也不长,所以我就把这俩合一起了,跟咱们刚才说的二者两个方法中的这个对比关系没有关系啊。是这个意思说在战争当中啊,与性能调优啊,与性能调优最为密切的部分,就是咱们前面提到这个局变量表方法,在执行的时候呢,虚拟机使用局无变量表来完成方法的传递,哎,能不能看得懂,就是咱们说这个方法的调用,包括咱们说的main方法啊,你也是个方法,整个咱们说这个站啊,其实到目前为止大家应该也有一些理解了啊站呢是管运行的啊,当然这运行这个事儿,通过下一个操作数站呢,也能更好的理解,呃,那么呃,我们这里边呢,就会存储,不管是基本数列型引用类型也好,都在这个局部变量表里边,嗯,那你要是在堆空间创建相应的对象,我这儿呢就会存储你这个对象的一个引用,这个引用呢就指向你了,那么我们这个局无变量表就存储的这个数据,这个数据呢,就会呃,需要load加载啊,Store啊等等,它可能都会影响到我们堆空间中的这个垃圾回收,所以呢,在战争当中啊,战争当中对我们这个调优比较密切影响的就是这个局部变量表个。
07:47
压表中的变量如果不存在了,那这个指针比如说不存在了,这个拉筋呢就要被回收,哎,这就涉及到这样一个性能调优的问题啊,哎,包括呢,就是我们这个占呢,最后溢出了啊,这个内存不够了,战帧当中占据空间比较大的呢,也是局无变量表,局无变量表越大呢,这个战帧就越大,那这个占里边可以嵌套的方法的个数呢就少,哎,所以呢,都跟它有很大关系啊,这要注意。
08:13
下一个问题我标了红色了,说局物变量表当中的这个变量啊,也是重要的垃圾回收的根节点啊,只要被局部变量表中直接或间接引用的这个对象呢,都不会被回收,呃,这呢就提到一个垃圾回收的根节点问题,这儿呢,就是咱们后边讲的垃圾回收算法,有个呢叫呃跟搜索算法,也是真正咱们Java中选择的这种算法啊,或者也称作叫可达性分析,呃,这个呢,到时候我们再讲这个根节点的问题,你先知道啊,局部变量表里边这个变量呢,就是我们作为垃圾回收的根节点的之一的一种选择,也是非常重要的一种选择啊,所以呢,整体来说就是这个局部变量表呢,很重要,就是这个意思啊。好,那么关于局部变量表的说明呢,我们就到此为止。
我来说两句