00:00
下面呢,咱们来说一下关于slot的一个理解,Slot的话呢,我们翻译成中文呢,通常还叫做槽,哎,就这个槽的意思,诶这呢其实指的就是咱们局部变量表里边的具体的单元,这个单元呢,咱们就称为叫槽。那局变量表呢,咱们说它实际上就是一个数组嘛,对吧,数组的每一个位置,像咱们以前呢,你说的是比如说int型的数组,那它的第一个位置呢,我们说这个int型的变量了啊,那咱们现在叫局部变量表,它不能说具体是某一个类型的了哈,你要非要说的话,那就是一个数值类型的是吧?啊是一个这样的,当然呢,我们习惯了把它的每个单元呢,称为都是一个slot啊,就是一个槽,好,那咱们说了这个局部变量表,它存储的这个呃数据,呃这个数据的话呢,它是个数组嘛,它就是从索引零开始的,一直到这个长度,简易,这个不用多多啰嗦啊,数组就是这样子的,然后这个就变量表的基本单位,基本单位呢就是槽,这个呢,大家记住它。啊,这是这个,嗯。Z啊,这个哎,就是槽啊,行,然后呢,这个局部变量表中存放的是编译期就知道的基本数据类型,引用类型,然后return address类型的变量,这个咱们已经说过了啊,而且这个长度呢,咱们都已经确定下来了,在编译期间就确定了,那后边我们要讲的这个操作站也是一样,也是在编译期呢就确定下来了,行,然后下边这个啊,说在这个局部变量表里边啊,咱们这个32位以内的类型占一个slot就占一个槽就行,然后64位的这个类型啊,它需要占两个槽。
01:32
需要占两个槽啊,那64位类型呢,主要是针对于两种类型,一个是浪类型,一个是double类型,咱们呢学习Java应该知道基本数据类型里边这个浪呢是占八个字节,然后double部呢也是八个字节,然后呢八个字节一个字节八位八八六十四,诶是这样子的,那咱们引用类型啊,它也是占32位啊,零类型呢也是32位,嗯,这个大家注意一下,那像咱们提到的,既然数值类型呢,将bet short叉直接呢转换成int,布尔类型呢也转换成int,零呢是false非零是处跟咱们C语言一样,然后long double呢是占这个两个slot,这个上面没写这个float啊,Float呢也是相当于一个呃,Slot就行,对吧?嗯,这个引用类型也是一样啊。
02:15
好,这个等一下咱们来演示,先把这个知识点呢,咱先过一遍。嗯,这个既然呢,咱们给每一个变量呢,都分配了这个索引以后,咱们就可以根据这个索引呢,去访问对应的局部变量了,那这里边就有个问题,比如说刚才提到了像这个long类型的,像这个double类型的,它们是占两个槽嘛,那也就是说呢,比如说像这个double,它的槽呢,是四跟五都归它占用,那我们要调用这个double型的Q变量的话呢,应该是这个用四索引呢,还是用五索引呢?在这里边强调一下,我们用它的起始索引就是用这个四,那类似的这个M的long型变量呢,我们想调用它,那就是用这个索引一就可以了啊,那这个变量的一个赋值就在我们这个数组中,到底先放谁后放谁,咱们说数组是有序的嘛,啊,是一个有序的,那有序的话呢,到底先放谁后放谁呢,就按照他声明的一个顺序啊,就像咱们这个给大家分分析的这个may方法和这个test static一样,先生命谁,那谁就先分配,那像may方法呢,就是先是行参啊,这个很好理解,OK。
03:19
使用前一个索引这块强调了,然后下边这个大家需要注意一下啊,说呢,当你这个方法是一个构造方法啊,或者是一个实例方法,实例方法就是非静态的方法嘛,这两种方法的时候,像咱们说这个构造方法,它就是这个构造方法是咱们自己定义的,然后在这个内存层面呢,不是内存层面哈,在我们这个字节码层面呢,这不都会跟我们生成这个叫in吗?对吧,来生成这个in啊,那像这种这个这个叫什么,这个构造器的这个方法,和我们这个自己定义的这种非静态的方法,咱们下边定义的这个TEST1到五四呢,都是非静态的这些方法呢,诶他们因为没有静态的声明多一个引用,哎大家注意啊,会把当前对象的引用呢,诶放在这个索引为零的一个slot处。
04:11
那这要注意,有同学会想说,那实例方法呢,理解我们经常在实例方法中调Z4点,对吧,你比如说你像我这里写的这个。T3T3呢,这个count,这个count就是咱们当前类的一个实例变量了,那这个count前面呢,相当于是有个Z嘛,这个Z呢,其实也是个变量,那这里边呢,我们就呃需要把这个Z呢,也作为一个变量呢,放到这个局部变量表当中了,那构造器咱这没定义,但是构造器呢,大家肯定应该也知道哈,Public我写一个构造器的话。你想想构造器里边咱们是不是也能够调C4啊?这应该记得了,对吧,这个这呢,这不是就是咱们理解成叫当前正在创建的对象嘛,所以说呢,我们在构造器当中,还有咱们这个,嗯嗯,叫实例方法当中都有这个Z次变量也是一个参数,需要放到咱们这个,诶这叫什么?局无变量表当中,局无变量表中呢,需要放这个这次,那从这个角度来说的话呢,咱们写代码的时候,大家都有这个经验,在静态的方法当中是不可以引用这次的。
05:18
比如说我们这边,我去这个。打印一下Z次点count,这个是不允许引入这个Z的,那现在呢,你就能够解释说,为什么不让有this呢,我们说哎,因为这个这次这个变量它也是个变量嘛,不存在于哎当前方法的局部变量表中,哎进而的话呢,你就不能够使用这个Z了。那构造器,包括咱们说的这个实例方法都能够使用这次啊,主要原因还是因为在他们所对应的这个局部变量表当中啊,是有Z次这个变量的声明的,给人留位置了,所以人家就能用,诶这呢就是咱们强调的这个知识点需要大家注意,而且这个Z次呢,它一上来就放进去了,也就是说按照顺序来讲呢,它是首位,诶这个呢,注意哎行,那这个理论的内容呢,咱们就说完了,那下边呢,咱们通过这个代码呢来体会一下,哎,重点呢,咱们就来看一下这个非静态的这个方法了,静态的这个咱们刚才那会儿讲这个自解码结构的时候呢,已经说到过了啊,所以在这块呢,咱们来呃说一下,就是关于咱们说关于。
06:28
Slot的一个,呃,使用的理解好这呢,为了方便啊,咱们这个把构造器也拿过来,因为构造器也是咱们说的其中的一部分啊,就都放在这儿了,行,那这个代码呢,因为我改过,所以先重新做一个编译。诶,编译好了,编译好以后呢,我们在这块点击一下,呃,你刷新不刷新都可以啊,这个应该进来以后呢,也算是新的,以防万一呢,你刷新一下,嗯,看一下这个method method,咱们先来看一下这个普通的这种实例方法,一会再看这个构造器啊呃,T1。
07:02
咱们刚才讲过了几个理论的知识,我们一一呢进行一个验证,T1里边呢,打开这呢是它的这个声明,这个不多说了,这呢只有public没有static啊,然后这个code呢,这一共是有这个43行代码,从这来看,从零一直到42,对吧,它这一共是40行,43行代码,变量呢是一共生命有四个,哪四个呢?这个你不用自己在这分析了,直接点这个位置,0123,这不就四个吗?呃,很清楚是吧,哪四个呢,大家注意现在呢,是非这个静态变量了,哎,静态方法,所以呢,我们这个Z呢,刚才提到了啊,它会放在首位,然后依次呢,我们有date name1和infer date name1和infer,对吧?哎,就是这四个啊,嗯,那多说一句,你比如说我们这个INF for的话呢,是咱们调T2方法返回值,诶赋给了一个叫in for,那我要是把这个in for这个声明的删掉呢。我删掉了对吧,删掉以后呢,我这进行一个重新的编译。
08:05
我重新编译了,然后这块呢,咱们直接刷新,诶大家看,那这个时候呢,我们就没有这个银粉变量了,因为呢,相当于直接调用完,我们没有把它附给一个变量来进行一个保存,因为像这种方法,我们说你调用完以后,它这个值你没有保存的话呢,你就不能再使用了,所以我们在局部变量表里边,相当于就没有给它再分配空间啊,就成这意思了,所以这块呢,这不就成了三个变量了啊,这个注意一下这个事儿,呃,这个大部分这个情况呢,咱们都已经解释过了啊,像这个是呃,它的从零加四十三八加30 51加32,结果呢都是43是吧,就是我们整个这个代码一共就43行,就是从头一直作用到尾嘛,哎,就这意思啊,没有异常,这是它的这个信息,嗯,这里边呢,就这没有过多的给大家要介绍的了,这个都比较清楚,主要呢,就是看一下这个零这个位置呢,是一个Z啊好,然后呢,咱们来看一下这个TEST2这个方法。
09:05
嗯,点开T2这个方法,咱直接呢,就来找这个旧变量表了啊。看这这个T2的话呢,你看首先呢,在零位置上放的也是Z,这个毫无疑问,然后呢,行参这块我定义了两个变量,一个是date类型,一个是string类型,所以呢,这是date,这是string OK,没问题,诶下边是赋值了啊,然后再下边是double型的一个weight,诶double型的一个weight那一四呢,0123,在这个double这块呢,我们说过了,Double也好,浪也好,它要占据两个slot。诶占据两个sloter,所以呢,诶三四都是它的,三四都是它的,当我们要调用这个double型的这个变量的时候呢,我们就引用它的起始的三就可以了,然后呢,在下边是一个叉叉的话呢,这个直接就蹦到五了,诶这个大家就清楚啊这呢就是我们定义的这样的几个变量,主要呢来理解一下double和long啊,需要占据两个slot,那这个string为代表呢,就是引用类型,那引用类型的话呢,也是占据一个slot。
10:13
啊,因为你看这个结束之后,它直接呢,就从三起了,占一个次lo就OK了,行这个不多说了,然后这个T3呢,咱们知道前面有个Z点,那TAG3里边没有自己定义变量,那它就只有一个,那就是Z。对吧,诶它就是一个Z啊好,这呢是我们说的这个,然后翻回来呢,咱们再看下这个构造器,构造器的话呢,点进来这不就只有一个Z嘛,就是当前正在创建的这个对象啊,因为构造器里边咱们说呢,它也诶有这个Z,呃,那具体这个,呃,刚才通过强调这里边这个信息呢,我就不多在这写了啊,咱们在这个呃PPT里边啊,我这都写出来了啊,其实这个PPT呢,呃,确实我制作这PPT花了挺多的时间啊,大家知道本身这个PPT调格式就很麻烦,另外呢,加上这个画图,诶加上这个内容那个校对,诶这个是有一些时间花到这里边了,诶这个主要内容呢,大家都看这个PPT就可以了,如果呢,你要说具体想演示的话呢,再看我们这个具体的代码就行。
11:11
好,这是我们说的这个lo的这个问题哈,然后呢,再多说一个问题。嗯,在这啊,大家看这说这个slot呢,存在一个叫重复利用的问题。哎,重复利用问题看是这个意思,说战争当中的局部变量表,它这个槽位叫slot呢,是可以重复利用的,说呢,如果一个局部变量出了它的作用域了,那咱们就可以回收,那你回收完以后呢,它这个位置呢,我就可以再用别的这个变量去占据它,呃,主要目的呢,是节省资源,诶很清楚啊,那这个事儿的话呢,不难理解,主要我们看演示,直接呢,咱看这个TEST4这个方法,这个方法里边,呃,那先考大家一个问题啊,你想想这里边一共定义过几个这个局部变量啊,就局部变表的这个长度是几?首先你看啊,这次是不是占一个,然后呢,这是第二个吧。
12:01
其实这个要考大家的话呢,呃,有点难度,因为这涉及到重复利用了啊,所以我叫局部变量表的长度,跟我们说这个变量的个数呢,其实不太一致了,因为有一个重复利用,说你看咱们就先说变量个数吧,这次是一个,A是一个,B是一个,C是一个,对吧?啊按照我们刚才这个解释,这次是1234,按说呢,我们这个局部变量表的长度应该是四,对吧,那我们实际看一下。你看它这个长度是三,那本来应该有四个,怎么是三个呢?因为有一个存在这个重复利用啊,我们打开这来看啊,这个零是这次不多说,一呢是A啊,也不多说,然后这个B大家看一下。这个B啊,这个B的话呢,你看它的这个索引是二,它的这个起始的作用呢,是从四,四加四是八,你看这个呢是13,这个也是13,这个13呢,跟咱们说的这个长度13是对应的,也就是说呢,这个Z和A呢,就一直作用到结束了。
13:01
啊,抑制作用到结束了,但是咱们这个B它是四加四八,它出了这个大括号以后呢,它就挂掉了,那既然你出了大括号就挂掉了,你作用欲呃这个没有了,它就销毁了,但是我们这个数组这个位置已经开辟了,这个我们说数组它不能说动态的这个变长或变短了哈,诶空间已经给你开辟出来了,那我要再生明个C怎么办呢?重复利用呗,哎,所以这个我们标识一下啊说这个变量C,诶它呢,诶是使用之前已经诶销毁的这个变量B占据的。这个slot的位置。所以呢,我们会看到这个C呢,它也是在这个index为二类的位置上。诶,这个就是我们刚才说的这个slot的一个重复利用的问题,好,那这个呢,咱们关于这个slot,以及对应过来这个静态方法,非静态方法里边具体的这个变量的分配的细节啊,就是完整的就说透彻了。
我来说两句