00:00
好,那为了呢,大家能够对这个局部变量表呢,有一个更清楚的一个理解啊,就是咱们既然讲这块内存结构了,那就把它呢理解的透彻一些,那要想透彻的话呢,咱不能在这干说了,那需要借助于咱们说这个自解码文件,它到底呢,解析以后的这个格式啊,其实就是咱们刚才呢通过这个,诶这个接class lab呢,咱们也解析看到过这个格式了,那把这个class lab呢,这里边展示这个信息呢,其中咱们需要大家关注掌握的部分,咱们给大家再做一个说明啊,是这样子的,行,那首先呢,把这个关掉啊,先多说一句,就是呃,程序呢,已经写好了,咱们呢可以通过,就是得到这个自解码文件以后,需要先做一个编译啊,这个程序呢,为了防止你之前修改过,咱们可以先重新呢做一个编译。那编译完以后呢,咱们其实刚开始的时候呢,就可以直接呢,在我们这个命令行的位置呢,大家使用啊jarp这样的一个指令,咱们进行一个解析,解析以后呢,诶我一执行咱们那会儿呢,其实也解析过,那得到的这个信息,实际上呢,我们来了解这个自检码文件的话呢,已经是比较清楚了。
01:12
哎,已经是比较清楚了,咱们就以这个main方法为例啊。这个比较长,好这是没方法过来了,这是呢,咱们没行没方法内部的几行代码,那么说有几个变量呢?诶这是一个,这是两个,这是三个变量,诶一共呢是有三个变量,然后在这块呢,也有具体我们这个变量到底是什么都有描述,然后呢,上边大家看到呢,从这个位置开始,一直到咱们下边这块。整整多了。一直到咱们这块呢,都是咱们相当于是Java代码,把它呢编译成自解码以后的这个自解码指令,呃,是这样子的,就是我们相当于通过这个jap的指令呢,已经可以能够看一看我们自节码的这个格式了,但是为了更方便,或者这个信息呢更清晰,那我们这块呢,大家可以使用这叫诶接class lab了,我们这个插件已经装过了啊行,点开以后我们就在这能够看得到了,那咱们呢,再稍微的解释一下,这个结构里边呢,有几个几个点呢,是需要咱们清楚的,嗯,整体的这个结构呢,咱们就不具体细说了,咱们只看目前咱们为了更方便的大家去理解这个,呃,这个这个局部变量表,咱们来讲这个内容啊,那method这里边伊的方法呢,这个就是咱们说的这个构造器了啊,这就过了啊,然后呢,下边这个may方法。
02:34
看一下。嗯,这样,那这个may方法呢,我们打开,首先你看这里边它有几个部分,就把这几个部分呢给大家解释一下,首先这个may方法这块呢,这这边有说明,说这个方法的名字呢,叫做may方法,然后下面呢,是关于这个方法的一个参数,参数呢我们能看到整个这个方法呢,是一个返回值,是word的,然后是string类型的一维数组,这个L呢,指的是引用类型变量的意思。
03:00
然后下边呢,是它的一个访问标识,叫做public static,所以呢,整个呢就构成了我们这是这个方法,它是一个public static VO的一个叫main方法,而且呢,参数呢是死锥形的一个数组,这这关于我们这个方法声明的所有信息呢,就都在这儿了,OK,然后接着呢,我们看这个code code的这块呢,就提到了这样的一些信息,咱们那会也提到过啊,说这呢,就是我们这个自解码指令,一共呢是零,呃,这到15就跟我们刚才在扎这块,通过扎P呢看到的这个信息呢是一样子的,好,这个我们收起来,然后呢,咱们当前的me方法呢,是没有异常的,所以这块呢,大家看到就空的,哎,咱现在呢,也没有必要专门为了说这个异常而说,而而造一个这个。返回有异常的啊,这个咱们就是现在需要什么,咱们就讲什么,后边呢,咱用到了,咱再给大家举例,完整的内容咱们放到这个自己MR自MR这个与类的加载片。啊,就是大家呢,先根据咱们现在的讲内存的需要呢,咱们来看这些结构啊呃,当你把这一套视频看完以后啊,那么字节码与类的加载片呢,这个视频基本上我也就录好了,大家可以到时候再接着无缝对接的看就可以啊然后下边呢,是我们说这个,这个叫哎MIS这样的一个信息,这里边呢,就指明了咱们的局部变量,它的最大的长度是三,哎然后整个code的lengths呢是16,这个16是哪呢?大家会看到从这哎就是往下拽,一共呢就是16嘛。
04:28
嗯,这呢是从零开始的,对吧,还15,这一共是16啊,OK,这个呢,就清楚这样一个事情了,一共是16行,这个代码说白了,这个十六指的是咱们这个自检码指令的长度,不是说咱们这块啊,这块你说我们这13~17嘛,也不是这意思了,是看这个自检码指令的一个行行数,OK,再往下,下边这个呢,叫做line number table,直译的话呢,就是行号的表。哎,行号表,这个表是干什么用的呢?但是你看右边这个信息其实就知道了,这里边呢,其实就是列举出来了,主要呢就是这两个啊,一个呢叫star PC,一个叫line number,就是咱们Java代码的行号和自解码指令的号的一个对应关系。
05:15
哎,Java代码的行号,你看咱们Java代码呢,这块不是从这个,你看这是从这来看呢,就是从13,诶这样啊,从这个13,这不是到17嘛。再往这拽一下啊,这个你要包括这个方法声明呢,从13开始,你要具体指这个方法这个具体内部信息的话,这不就从十四一直到我们这个17啊,14 15 16 17这样的,然后呢,这呢是它对应的这个自解码指令的一个行号啊,咱举个例子,比如说这个15 15的话呢,这我们定义的一个变量是十,15对应的自解码指令是八,然后回到我们这个code的这块,大家看一下这个八,这不就是诶我们push了一个十放到咱们的局无变量表了,就是这个意思。呃,它呢,是有这种一一对应关系的啊,16对应的这是十一十六呢,是我们调了一个方法,然后回过来你再看这个,呃。
06:04
16对应的11啊,就是这个操作,那这个就理解这个事儿了,行这呢就叫我们这个行号的一个表啊,然后下边呢,叫local variable table,那叫局部变量表的一个就是局部变量表了哈,那这里边是什么信息呢?其实呢,就是对我们呃叫这个方法里边这个局变量呢,进行了一个刻画啊,我们看这里边都有哪些具体的情况啊。那进来以后呢,我们看到这个还是比较长的,咱们先找自己比较熟悉的这个信息,首先呢,我们提到过这个main方法里边,诶这再往这拽一下,这个may方法里边呢,咱们是定义了三个,算是三个叫局变量了啊,形成一个两个三个,所以呢,这个里边就是关于我们这个局部变量的描述,所以这块你会看到有三行分别呢,就是我们xx test和number,按照它声明的先后顺序,依四呢占据我们的索引位置012,好,先看懂我们这里边提到这个name和这个index啊然后呢,这个后边先说一下这个描述,那第一个X呢,指明就是它是一个string类型的这个这个这样啊,String类型呢是一个异维数组,L呢是一个引用类型的意思,然后中间这个呢,Test是咱们自己造了一个当前自己这个类的一个对象啊,引用类型的啊,是一个对象,是这个自定义这个类类型的,那呢是个int类型,所以呢,这个描述的话呢,主要是指明这个变量的类。
07:28
型变量类型有了,变量的名有了,诶然后呢,每个变量呢,都有对应的索引,我们根据索引呢去使用相应的这个变量,OK,再往前,那大家不清楚的也就是这两项了,一个呢叫做start PC,一个呢叫做LAS,好,这呢描述的实际上呢,首先说一下我们这个零八十一哈,这三个呢,仍然是咱们的自解码指令的行号,跟我这里边的star PC是一样的,那字解码指令的行呢,就是零八十一。啊,零八十一,然后这个less呢,呃,实际上是它的一个,我们通过这两个变量合在一起,实际上是描述咱们当前这个变量的一个作用域的范围的。
08:08
再说一遍啊,描述咱们当前这个变量的一个作用域的范围,呃,这个零八十一呢,其实就是它的作用域的一个起始的位置,那你想想我们一个变量作用率的起始位置,不就是你这个变量声明完以后吗?你声明完以后不就可以作用了吗?是这意思吧,诶你比如说咱们说的这个谁呀,说的这个number吧,大家看这个number啊,这个number呢,咱们这写的是11NUMBER,这写的是11,然后回过来大家找这儿,呃找这11呢,对应的是16,那16呢是咱们代码的第16行,那就是这一行,诶这不就说清楚了,咱们这个变量声明是在这儿,然后呢,它的作用的域的范围呢,就是从它声明完以后开始的,所以说你会看到这块呢,就是诶11了,说白了就是你声明的下一行,其实是就声明的下一行是它的作用于开始的一个位置啊,那类似呢,这个T呢,这写的是八啊,这个这个俩八啊,看前面这个八,这个八呢在这儿。
09:09
诶就是这个八八对应咱们代码呢,是第十五行,诶第十五行在这儿,呃,因为你上面生明了T子以后呢,从下一行开始,它才诶有这个作用欲了,就是它才可以去使用是吧,有效,所以呢,我们诶就往下来延伸,诶这个大家就明白这个意思了啊诶这个呢就知道它了,然后这个16呢,是指的是长度哈,这个不是它的中止位置,就跟咱们说,比如我定一个变量叫做hello。诶,我这个E呢是索引一的位置,我想取一个子字符串,我想从一开始取两个长度,那就是EL,那这个二呢,不是结束的这个缩引啊,这个大家这个大家要看清楚,那你会发现一个特点,就是零加16,八加八,呃11加五,结果呢都是16,这个16呢,就是咱们这个代码的长度。因为咱们在这个main方法中定义的这几个变量,它都是出了这个大括号以后它才失效的,言外之意呢,它就它的这个定义的这个变量的作用域呢,结束的位置就是你这个方法结束的位置,所以这个是16就知道了啊,你看这个就这个关系行,那通过这main方法咱们讲的很清楚了啊,那么咱们再抛一个小练习,练习的话呢,不妨我这块还是以这种静态变量静态的方法来说,我是一个word,我叫一个test static,我这呢就不加参数了,在内部呢,比如说咱们也,嗯造一个这样的对象,这是一个,我再来一个date,诶造一个date对象,我再int,我也来一个,我来一个叫count吧,这个也是个十,嗯,然后来一个输出语句吧,我把这个count打印一下,我就随意的写了这样的几行代码,写完以后的话呢,一定记得先重新的做一个编译啊。
10:56
好,编译完了,然后呢,我们再通过咱们这个来接lab呢,来刷新一下,来看一看这里边的方法,咱们刚才讲了密方法,这个呢,咱就快速的来说了,大家看看你能不能自已呢分析清楚,你自己呢,任意的定一个变量来定一个方法,看一看这个我这儿还定义静态的,因为非静态里边有一个小细节点需要说,咱们一会儿来讲啊,还是个静态的,我们看一下这个test static,好,这呢关于它的描述方法名,这呢是没有参数的,呃,整个方法是VO的public static这样的权限啊,很清楚,然后再往下这个code,它的这个自检码指令啊,这个还挺长的啊,诶从零是不是到26了,哎,从零到16啊,那这一共算多少行呢?不就27行嘛,零开始的对吧?哎,这不就27行嘛,行,然后呢,一常也没有OK,嗯,这个变量呢,一共三个,你自己数数啊,一个两个三个啊,就这仨变量好打开以后看看这个是不是这仨变量,我们先看下这个local variable table 012,然后test data。
11:56
和这个count,诶就是这三个啊,然后呢,上面是这个行号,嗯,这个table,就咱们说的这个代码,从21行到二十五行,21~25,诶对应的我们这个,呃,左边的这个字解码指令的行号啊,就是这样的一个对应关系,这个数呢,大家去扣的这块来这去对应的找就OK了。
12:17
啊,非常清楚,就是你写的每一行代码,到底自检码指令是哪一行啊,就看我们这个行号table就行,然后呢,我们这个局部变量表呢,嗯,你看到这是它的起始的作用的,这个起始点就是它相当于是它声明的下一行开始,然后这个L呢,是它相当于是有效的这个长度,这两个数一加,你会发现呢,这几个都是27对吧。因为我们整个代码呢,一共诶看这就是27行,相当于这几个变量呢,就是从他声明之后的下一行开始,一直到结束全都有效,诶就这意思,诶那刚才呢,我花了一些时间呢,大家把这个结构呢,能够看得懂,那对于我们未来再去学这个字节码呢,也是有好处的,呃,到时候我们在讲的时候呢,这个过程呢,就呃不再给大家去强调了啊这个大家呢要清楚,然后呢,你自己大家注意啊,你别自己现在听着感觉挺热闹的,比较清楚,你自己亲自呢写一写,演示一下,我觉得你掌握的才更牢固。
13:13
啊才更牢固,行,那为了呢,咱们更好的去理解局部变量表,咱们把这个资金码指令这一部分呢,也给大家讲授了,大家呢下来实操一下。
我来说两句