00:00
下边啊,咱们对常量池表这些数据呢,咱们做一个小结,诶做一个小结啊,那我们刚才看到了咱们常量池表中的这个数据的话呢,一项一项的,其中的每一项的开头啊,其实都是一个tag对吧?哎,都是一个tag,这个tag呢,那表达的是什么呢?就是你对应的这个,呃,我们说叫常量尺表,你这个表的每一项呢,是一个什么类型的,根据这个tag值,咱们来这边呢,去找,其实你看这个tag也行,或者看这个也行,是吧?呃,你去找看看每一项呢,到底是一个什么类型。啊,咱们以前的话呢,讲过数组是吧,哎,咱们做一个类比啊,咱们数组的话呢,其实每一项这个类型是不是都是确定的,你是个硬特型的数组,那就是。每一个都是int是吧?当然呢,你要说用引用类型,你说我是一个object类型的一个数组,那当然这个整体上来看都是每个元素都是object,但细节的话呢,你可能你是一个string,你是一个date,你是一个呃,In上杀的是吧?呃,具体类型还不一样,就是我们这里边呢,表其实也可以看作呢,就是一个数组了,只不过呢,我们这个首,所以呢是从一开始的到你这个诶countt减一是吧,诶这样的一个索引的范围,然后每一项呢,说到底是一个什么类型的啊,咱们首先要看的就是这个T。
01:16
诶,根据这个tag呢,来做了一个决定啊,那这个表格呢,就是整个列出来了,我们在这个常量池表当中可能出现的这个数据类型,那咱们目前呢,看到的没有在咱们当前这个DEMO资金码文件里边见到的,关于这个Java这个动态引用这块呢,咱没涉及到,这是JDK7呢,我们才加入的这个情况是吧,那这呢,关于这个method handle,就是关于对方法句柄的这样一个刻画,关于方法这个类型的一个刻画啊等等。啊,这块呢,咱们现在就不过多的去介绍它了啊,这个后续的话呢,大家有兴趣呢,诶可以咱们再做一个说明啊,然后呢,前面这一项呢,目前咱们这个没见到,因为咱们没有涉及到这个接口的问题,对吧,还有呢,包括这些这个基本数据类型的这些其实我们也没有见到。
02:01
对吧,咱们刚才见到最多的实际上是关于class啊,关于这个,呃,UTF8这个字符串分别量的描述啊,啊,包括这个属性方法啊,这个因为DEMO中咱都有,那这个嗯。这个这个算是基本数据类型这块怎么就看到了呢?咱们在讲这个的时候。看一下啊。咱在讲这个自变量和符号引用的时候呢,这不就提到过说这个自变量呢,一个呢是我们说的这个文本,就是咱们刚才说UT8,还有呢,就是生命成final的这个常量。嗯,咱们当前这个代码就是如果大家在这个idea当中来看,是不是直接,哎,这个我们再给大家re compel一下啊,这呢是咱们这个刚才解读的代码长这样子的啊,然后在这我来看一下这个结构,跟咱们刚才用这个工具看呢,实际上是完全一样的啊,这块呢,就呈现出来我们这个常量池里边这个数据,目前这里边呢,是没有这个像基本数据类型的这些描述,对吧,怎么就有了呢?如果我们这个变量呢,它变成是一个常量了,诶相当于是我们加了一个final对吧,那此时呢,我们这个number呢,在里边就不能去修改这个值了,把它呢,重新咱们做一个re compel。
03:08
重新编译。重新编译完以后啊,已经编译好了,对吧,大家这块呢做个刷新啊,注意你看我们这是21项啊刷新一下。然后常量池这块,那这时候多了啊,多在里边呢,你去找诶大家会发现呢,这是不是有个叫iner啊,因为我们这是个int类型,这个值是一嘛,是吧,然后这个in iner看这个值就是一啊,比如你这块改成改成11,咱们再重新的再去re compel一下。啊,这块你再做一个刷新,那这是不是就变成11了,对吧?诶这个呢,就相当于是咱们这个算是基本数据类型的这种自变量,前提呢,诶你得是个常量,这个时候呢,我们会把这个数据呢,也呈现在我们这个常量池里边,那如果你要是个变量的话呢,这个咱们就不会在这个时候去复制了,哎,它得再通过我们加载以后啊,到时候我们再谈这个复值的这个过程,OK啊行,这个呢,就是我们说的,呃,关于这个类型的一个描述,然后大家呢,你看这个表格的时候呢,还会发现一个特点,就是这里边的话呢,你看ger float long double这四种类型是有的。
04:11
咱们说基本数据类型的是不是一共有八种啊。还有哪几种没出现呢?BAT,诶,Short。这个呃,差。A bully。是不是这四种类型没有出现啊,对吧?这个在咱们前面讲上篇的时候呢,其实给大家也提到过这个事儿,这四种类型,呃,这个一个字节,就在咱们这个Java讲语言的时候是吧,一个字节两个字节,两个字节,这个是不谈字节了啊,只有出跟false,他们其实在我们编译之后呢,他们类型都可以理解成是一个对吧?哎,都用in,我们去这个装配啊,是没有问题的,所以呢,哎,这里边我们就没有出现这四个类型。啊,这要注意一点,然后这个float的话呢,它是四个字节嘛,所以这是U4,需要重点关注的就是我们这里边这个long和double long和double的话呢,我们讲Java语言的时候也提到过,他们是八个字节,所以这里边呢,它俩比较特殊,它俩是U8,就用八个字节呢来去装配这个数据啊这里边大家要稍微的小心一点啊行,那这呢,就是我们算是一个这块的一个小结,然后再回过来我们说一下这个事儿。
05:18
哎,咱往下里边捋一捋啊啊这这这个就咱们自己一个个去解析的是吧,就很容易就演化了啊哎,以后的话呢,咱们就呃不刻意的带大家这样一个字节一个字节去解析了,咱们直接呢,是不是用这个接克拉lab这个工具啊,或者你在idea中看插件,当然呢,也可以用扎P是吧,扎P咱们讲到后边的时候,咱们带着大家呢,再说一下这个扎P的这个事儿啊,以后呢,咱们就直接用这个现成的了,就不自己一个一个的去解析了,至少呢,我们也解析过对吧,知道怎么回事就行啊,然后我们这块呢,做一个呃,总结说这十十四种这个常量项的这个结构啊,有一个共同点就是第一项都是一个tag标识,标识位啊标志位表明呢,就是我们当前这个常量项它是哪种类型的,咱们已经说过了,然后另外呢,就是提到这个,呃,字符串这种类型啊,UTF8是以UTF杠八这种格式编码来进行一个编辑的啊,是改进的这种格式啊,这个了解一下就行,然后呢,又提到一个问题,就是说这里边儿一共有14个常量项,14种应该叫常量项。
06:19
其中呢,比较特别的,咱们刚才在讲解的时候也提到过,就是关于这个字符串,你看它这块呢,是不是有一个LS啊。如果整个我们看成是一张表的话呢,这个关于字符串这块呢,它自己还是一张表,因为我们知道这个字符串呢,可能长可能短,所以呢,我们诶又是有一个计数器来表明你到底是有多长,相当于呢,我们用一个U1的一个数组也好,或者你叫表也好,是不是表示这个字符串啊。哎,没问题是吧,哎,它呢长度是不确定的啊,这个主要说的就是这个事儿,嗯,行,然后下边这块呢,哎,我们做个总结,就是常向池呢,这个理解为咱们class文件的这个叫资源仓库,当然你也发现了关于我们这个类型的描述方法,属性描述是不是都在这儿啊。
07:04
啊,当然这个事儿的话呢,大家再去理解的话呢,说跟其他项目关联最多的就是在这儿了,我们还可以。通过咱们下边要讲的这个字段表和方法表,包括属性表,咱们再去体会啊,你更能知道,呃,其实它都要借助于我们这个常量池啊,这个情况都要跟他进行打交道啊。那最后呢,又回归到这个终极目标上,说为什么我们要长按池里边包含这些内容,咱们呢,其实在讲这个自变量和符号引用的时候呢,其实也提到过这个问题,就是呃,我们Java程序的话呢,不像C或自节夹直接呢就翻译成这个机器指令去执行,哎,我们呢是先这个编译成自解码文件啊,自解码文件中因为呢,还不涉及到往内存中去加载,对吧?所以这时候呢,我们没有办法确定它真实的内存的地址,所以只能是保存这些符号引用,哎,当然我们真正进行这个呃类的加载啊,形成这个动态链接的时候,那此时呢,我们才转化为这个叫直接引用。啊,通过咱们在这块的一个真实的一个描述,大家应该对这个符号引用啊,应该有一个比较清晰的一个理解。
08:08
好,那那关于我们常量池呢,咱们就介绍到这儿。
我来说两句