00:00
那我们为什么要学习词解码文件呢?哎,刚才啰里啰嗦呢,给大家讲解了一些这个内容,那么还有一个原因啊,这儿呢,我列了几个代码,通过代码层面呢,咱们来讲解一下咱为什么要学习一次解码文件啊,这呢,首先大家来看两个BAT的面试题。那第一个面试题说类文件结构有几个部分?啊类文件结构有几个部分呢?其实就是我们下边这个零三里边要讲的这几个内容,那就是这几个部分,OK,这是这个我们说的这个面试题的这个问题怎么答啊,那主要呢,我们想看的是第二个说呢,知道字节码吗?资金码都有哪些啊,它这主要说的是资金码指令啊,这个呢是咱们这个下一章啊,下一章啊,这是咱们不是第一章嘛,下一章咱们要讲的这个,呃,各种各样的自节码指令啊,那这个是其次的,关键就是后边这个大家看说X是五啊in y是五,说比较它俩是不是相等,说这个过程啊,都经历了哪些步骤。啊,从这个面试的角度来看的话呢,就是说呃,大家要想能够解决这个问题,需要我们学习次想法文件,当然这个的话呢,我们不能说为了面试去学习GM对吧?啊这里边儿我想解释的是什么呢?就是有一些操作啊,针对咱们代码层面的这样的一些操作,这些操作的话呢,我们只是单纯的看代码,你是看不出来他们有什么区别的。
01:22
啊,但是当我们通过资金码文件去观察的时候呢,大家就能够非常清晰的看到这样的一些细节,那么这里边我给大家呢,举了三个例子啊,这三个例子呢,都非常具有代表性。好,那我们就一块儿来看一看,大家呢也看一看啊,虽然做过Java开发了,然后这块呢,你观察一下,你看自己呢,是不是能够很清晰的啊,这个答出这样几个问题啊,那刚才呢,我们提到这个面试题呢,它是问说in X和呃特一个Y,这两个值呢,都是五,说问这两个值呢,它们俩是否是相等的,对吧。哎,不就是这个事儿吗,说这两个里边蕴含的这个字节码指令呢,是有哪些。
02:03
OK,那这个问题的话呢,比如我们先放一放。啊,这个我先放一放,大家呢,诶你有没有做过这样的两个面试题。啊,有没有做过这两个面试题,大家看一下这个I1这个是十啊,I2呢也是十,问一下它两个呢,是不是等等啊,这个大家应该都清楚,这个等等呢,对于引用类型变量比较的是这两个,嗯,对象引用的地址值是不是相同对吧?或者说呢,是不是指向同一个对象。那我们现在呢,把这个值呢改成啊从十改成128了啊,同样的这个方式呢,进行定义的,这呢都是自动装箱啊说这俩呢是不是相等,这个题呢,不知道大家有没有做过,那结果的话呢,如果你做过你是比较清晰的,如果没有做过的话呢,答案呢,基本上你是答不对的。啊,你看我们这时候执行的话呢,进行一个全量编译啊,就稍微慢一些,结果呢,我们会发现呢,它这块是一个处。这个结果呢,是一个false。
03:00
哎,很多同学呢,就会比较迷惑,凭啥你上边是个出,下边是个false,从结果往前推,我们啊能够发现说这两个变量啊为代表的是两个对象引用,对吧,它俩呢,指向呢,一定是同一个对象实体,而这两个呢,呃,相应的就是两个对象。啊,因为两个对象呢,它的盈利值不一样嘛,所以是false对吧,那这就是这样一个问题,那怎么去进一步来解释这个事儿呢?那我们就需要来看这个子解码文件,对吧?哎,包括这个吧,这个这两个呢,咱们也顺带着一起来打开,打开之后呢,因为这个代码我哎把它这个注释打开了,我们需要重新做一个编译。好,那这呢我就做了编译了,那编译之后的话呢,我们就可以来查看一下它这个资金码层面这个方法内部的这个相关的这个指令是如何来执行的。啊,咱们在讲上边的时候给大家也提到过啊,叫这个杰克lab这样的一个插件啊,大家呢,可以进行一个下载啊,一会儿呢,我们还会再稍微提一下这个事儿啊,哎,我这呢就直接呢,呃,先点击一下。
04:04
连接完以后的话呢,这里边儿大家就能看到,哎,关于我们当前这样的一个类。啊,你刷新一下也行是吧,如果你要有更新的话,你就刷新一下啊,诶关于这个类它的一个方法的执行,这里边我们主要关注的是这个main方法,然后这有一个扣的属性,点击一下,好,那这块我们看到这个词解码啊bad code这儿呢,就对应的是我们这个方法体的一个执行过程。那咱们就按照这个顺序啊,实际上呢,大家只要把第一组这个看清楚了,后边这个呢,也就相对来说比较清晰。当我们1X是五的时候,哎,大家会发现,首先呢,我们这个叫自己码指令是吧,哎,它这块的话呢,哎,其实这块因为我们叫这个操作码啊,这个操作码呢,叫icon的五啊,实际上呢,就把五这个数是吧,是一个int类型的,我们把它呢存放在这个操作数占了。哎,这个指令具体什么意思,这是咱们第二章当当中啊,重点要给大家讲的哈,呃,操作数站当中我们放了一个五啊,操作数占这个还记得吧。
05:04
还有同学,别,别前面学,后面就忘了是吧?这个我们再来看一下这个上篇啊。嗯,这个上边上边呢,我们在讲到这个站结构的时候在这儿。战结构,嗯,一个战针对应的是一个方法,咱们现在呢,是看这个may方法是吧,那main方法当中呢,有一个叫重点呢,叫局部变量表,还有这个,嗯,操作出战,这是两个主要的这个结构啊,那刚才我们提到是这个操作数站啊,临时来存放这个数据啊,然后局部变量表呢,来存放你这个操作完以后的这个相关的一些数据的保存啊,这个局部变量表呢,是一个数组结构,操作数站呢是一个占结构是吧。嗯,回过来,那我们这里边呢,这不是定义了一个这个常量五是吧,这个五的话呢,就放在这个操作站里边,然后大家会看到调用了我们里边的叫value of这个方法。啊叫value of这个方法,那这个方法是干什么用的呢?我们点开这个啊,然后ctrl o,咱看一下这个叫value of。
06:04
那就是这个呗。好,这里边大家会发现我们把这个五呢放进去,放进去以后呢,这里边提到了一个叫catch这样的一个结构,这是什么呢?一点击,这实际上呢,是我们英特尔的一个内部静态的,哎,静态的内部类啊,这个静态内部类里边呢,它保存了一个全局的常量啊,是cash始的一个数组,这个数组大家下来呢,可以具体细节来看一看啊,我这呢就主要来说结论了,这个数组当中它的长度。嗯,这个氦啊是由H负的值,H呢是127,然后这个漏呢是负128,那就是正的127减去负的128,然后加个一,这不就256嘛,哎,256呢,恰好这不也是咱们所说的那个一个BAT的一个长度啊,2562的八次方,我造了一个数组,然后接下来通过一个for循环的方式给这个数组呢元素进行负值,负的第一个值呢,是我们这个阶阶呢就是漏,也就是说负的128。
07:00
啊负128,然后先使用后加加对吧,所以呢,数组长度呢是256,第一个元素呢是负的128,那自然而然的,哎,最大的元素呢,就是正的二七。好,这就是我们数组的这个数值的这个范围啊,那我们这里边儿呢,大家会发现它调用了这个叫value o是什么意思呢。再回到咱们刚才。这个位置啊,再往上往前调啊。再往下掉。再往前掉。掉到这个位置啊,就是说如果你这个挨着值是在我们这个呃漏和这个氦之间,其实说白了就是在你这个负128到正的127之间的话呢,我们就直接呢,从你这个数字当中把你这个数据呢取出来。啊,因为这个底边赋值的时候呢,你看它实际上是都是new的一个一个的integer的嘛。对吧,哎,看的很清楚啊,那我们这个值呢是五,那大家想一想,我们这个值要是五的话呢,它给我们返回的是不是就是你这个数组本身的那个里边造的那个对象呀,哎,把它做一个返回,如果你要不在这个范围内怎么办呢?我们就去新用一个。
08:05
啊阴这。好,那基于这个结论呢,大家应该就非常清晰的就知道为什么说这是处,这是false了,因为这两个呢,用的都是内部的那个开支数组中的,诶,那个指定位置上的同一个对象嘛,所以这是出,然后这个呢,因为你超出了负128到正127的范围了,所以说呢,哎,是逆了两个对象,哎,这不就在这块呢,看出来了。对吧,哎,这个呢就能够解释了啊,那这个呢,能解释了,我们回过去再看上边这个情况。说1X是五都干什么事了呢?我们叫Y6OF5,哎,然后呢,这不是相当于造了个对象嘛,把这个对象呢,哎,这个对象不是现造的啊,是从这数组里边直接就返回了,对吧?哎,返回以后呢,把它保存在我们这个,呃,A store store是针对引用类型变量啊,保存在这个局部变量表啊,缩引为一的位置。哎,索引为一,哎,那索引为零存放的什么呢?哎,咱们看一下这个局部变量表,索引为零的话呢,它还有一个参数,这不叫X参数吗?
09:01
对吧,哎,这是索引零的位置啊,索引一的位置呢,就放咱们这个X了,OK,再回过来,那接下来的话呢,我们定义了一个。基本数据类型的一个五,就是这个五,把它呢直接呢,就存在我们这个局部变量表缩,因为二的位置上了。哎,这块不涉及到这个阴值的问题啊,因为这呢就是一个基本数据类型变量的赋值,这呢是一个自动装箱啊好,那判断它俩是不是相等,你这存的是一个什么呀?哎,这是存的一个数,这呢存的是不是一个。那低值是吧,按说呢,呃,引用数据类型跟基本数据类型是不可以做这个等等的操作的。哎,但是呢,咱们这儿其实还存在着一个是不是拆箱的一个问题啊。哎,因为拆箱嘛,所以我把这个X呢,就取出它的核心内容就是那个基本数据,数据的那个五跟这个呢,优势就出了。哎,这就是他这个,呃,下边一个比较的过程是吧。哎,比较过程,然后接下来呢,关于这个,呃,In I1是十这个跟这个其实就是同样的这个道理啊。啊,这个大家在下边这块这不都能够,你看这是刚才说那个拆箱吗。
10:03
哎,拆箱这块呢,这不就叫了一个int value这样一个方法是吧,拆箱啊拆箱呢,你这都是基本数据类型的五,所以这是个处嘛,然后再往下这块呢,涉及到诶我们又提到的,我就哎放了一个十啊这是这个十,哎这个同样的叫这个value o哎存储一下,然后下边这个呢。嗯,下边这个呢,我们定义的时候呢,哎,跟它的道理是一样子的。那这这这个是吧,这是I1,然后这个呢是我们这个I2,呃,上面这个呢,I1存储在这个局部变量表角标为三的位置啊,这个是角标为四的这个位置啊至于说诶这个怎么能长这样,这个怎么长这样呢?呃,这个呢直接是一个操作码,这个呢是操作码后边加了一个操作数,呃这个呢,咱们讲下一章的时候给大家具体来说啊啊,因为a store呢,它最大的这个数值就到这个三了。那你要四的话呢,只能是通过这种加一个操作数的这个方式啊来呈现。好,比较它俩是不是相等,这块我就不多介绍了啊,只要呢是这个看清楚了以后啊,这两个呢也就能够理解了,这也就是咱们为什么大家要学习这个自解码文件的一个原因,通过这个账号代码你看不到的细节,在资金码文件当中都可以看得到。
11:11
好,这呢是给大家举的一个例子。
我来说两句