00:00
那接着咱们往下看,呃,下边这个呢,我们叫字节码与数据类型,刚才呢,我们提到了说在Java当中,咱们字节码呢,它这个诸记符呢,长度不能超过一个字节,一共呢也就256种情况,对吧?诶超不过256种情况,那么这里边还有一个问题呢,就是咱们在Java当中数据类型啊,分的非常细致,具体有基本数据类型八种,还有引用数据类型,对吧?那么这个资金码指令呢,跟数据类型呢也是有关系的,所以这块呢,就提到了说大多数的这个指令都包含了其操作所对应的数据类型的信息。因为呢,咱们知道不同的数据类型,它在内存当中占用的大小空间也是不同的,对吧,这个咱们都知道啊,那比如说呢,像这个I漏的这个指令,这个指令呢,我们会看到它首先是一个加载,对吧?将这个数据呢,加载到我们这个操作站当中,那么加载的是一个什么类型的呢?前面呢提到一个I,那这个I呢,就指的是int类型。然后这个flo呢,这个当然也是一个加载到操作入站的一个操作了,把这个数什么类型的数呢,加载过来呢,是float类型的一个数据,所以这块呢,就提到了跟我们具体的数据类型是相关的,OK,然后下边这块呢,呃,其实呢是有一个分类。
01:12
啊,这块我写了,你看这一块,这一块跟这一块实际上呢,是一个分类的这个三种情况,也就是说呢,咱们在讲这么多指令的时候。哎,大家看有这么多种指令对吧,那这么多种指令的话呢,我们看它是如何与数据类型相关的。啊,如何与数据类型相关的一种呢,咱们可以把它理解成呢,就有点儿像叫强相关一样,也就是说咱们直接通过这个指令呢,就能够看出来。直接通过这个指令就能看出来,比如说像咱们刚才提到这个in,这里边像lo,像这个icon_一,这个AA,代表的其实就是我们说的引用类型,主要呢,就是这个对象类型,就是相当于我们引入的是一个对象,那这里边引入的谁呢?漏的零就是角标零的那个位置,这其实就是我们看到具体的这个局部变量表里边零那个位置是不是this啊?
02:00
那这是一个对象是吧,什么类型的对象呢?就我们这个DEMO这个类型的一个对象,所以呢,这是一个对象嘛,它呢就是一个。哎,就是一个A,就是属于引用类型啊,对象的一个类型的,然后呢,呃,还有下边呢,这块是不是有一个叫I cost,下线一这个I呢,就是一个int类型,那先整体让大体说一下,I呢,就是int型,L呢,Long s short b是BAC是叉,F是float d是double啊这个咱们也基本上比较清楚,咱在讲第一章当中实际上也提到过,关于类型这块呢,是不是有一个。有一个简写的名字对吧,只不过这里边我们都是小写的啊,跟这个前们前面说的那个属性不是叫属性叫字段的这个类型,咱们那个表示个I呢,其实是一个大写的I,咱这也都是小写的,这个大家稍微注意一下,这个呢,就是我们直接在这个操作码出去符,或者咱们叫这个具体的资金码指令这块呢,其实就能直接看出来它是哪个类型的了,这个咱们刚才也在这块去举例子了,第一个还有这个第五个这个是吧,嗯,这个就清楚了,行,然后还有一些这个指令的诸级符啊,咱们从这个指令上来看,是看不出来它具体操作的这个数据类型的,比如说呢,我们这个叫lance。
03:10
嗯的意思就是从我们这个操作占的一个占点呢,把这个数组呢,给它弹出来,然后呢,获取一下这个数组的一个长度啊,就是获取数组长度的一个指令,那虽然你看这个结构上,你看不出来它到底操作是什么数据类型,对吧,但是呢,我们明确一下,它只能够是操作这种数组类型,这种结构或者我们叫数组类型的对象。因为数组本身呢,咱们也看作是继承object对吧,数组也能点在object当中的一个方法对吧?行,这个大家要注意一下,就是虽然从这个指令上看不出来是操作什么类型,但是呢,它有一个隐含的数据类型的一个要求。啊,就这里边提到的数组类型,OK,那还有一些指令呢,就干脆跟数据类型呢,就没有关系,比如说呢,我们说的goto,它就跟数据类型没关系,所以呢,整个来讲,我们说咱们讲的这些指令,下边要展开说的,如果从操作与它关联的数据类型这个角度来分类的话呢,实际上是不是可以分成。
04:08
啊,你说三类也行,或者说我们把这个呢分成一类,这个分成一类,一类是不相关的,跟数据类型,一类呢是相关的,那相关呢又分成呢,叫显示的一个相关,就直接呢就看出来了,还有一种呢,叫隐示的相关,通过这个指令看不出来,但是呢,实际上也有隐含的一个类型,对吧?哎,就是这个意思。好,这老师我们说清楚这个事儿啊,大家要清楚,然后下一个问题呢。咱们应该也不陌生啊,应该也不陌生,咱们呢,一方面在代码层面,这个大家应该都写过对应的相当相应的一些代码,比如说我们定一个,比如我在下面,比如写一个BY的类型,我定一个叫B1,这个值呢是12,我再定一个比如short的类型的S1,这个值呢是十,我让这个BE1呢,加上一个S1,这个结果的话呢,我们说最小或者从容量上来看,是不是你也得拿一个in的类型来接收啊。对吧?哎,因为这两个数据做运算的时候呢,在咱们内存当中,这个BAT也好,Shortt也好,包括这个char也好,乃至于说波类型也好,他们都会转化成四个字节来存储的结构,那四个字节呢,典型的就是int类型,所以他们都会做一个转换啊。
05:16
所以这里边呢,就提到了大多数的这个指令都没有支持整形的BAT char和short,乃至于说没有支持布尔类型,那编译器呢,在编译或者运行的期间呢,会将BAT和short呢,转化成带符号扩展的相应的int类型,就是说白了就是有正有负。啊,因为bad short不是也可以取负数嘛,对吧?呃,这叫有符号的,然后将布尔类型和差类型呢,转换成叫零位扩展的,就是主要的都是正数了,相应的这个in的类型的这个数据。这个这个应该咱们大家都清楚,前面咱们也提到过这个,因为呢,我们在真正分配内存的时候,最起码我们也得分配四个字节,咱们讲这个这个方法局部变量表的时候,是不是也都提到一个一个的slot呀。你看我们这个局部变量表。
06:00
这里有一个具体的一个位嘛。嗯,其实这就是第一个呗,这局部变量表,这是第一个,其实就是看索引就行,这个索引是零,就是slot是零的位置,这个slot我们称为一个槽位嘛,这个我们在讲上面时候都提到一个曹位的话呢,它就是占四个字节。那你这块你一个BAT一个short进来,那最起码你也得占一个字节。呃,也得占这四个字节,那你这块呢,其实都转化成一个int来进行一个存储就行好,所以呢,我们在处理呃,这个相应的这些类型的时候呢,都转化成int类型,包括呢,我们在处理布尔类型,BAT short和char类型的数组的时候,因为数组元素呢,也是这些类型,所以呢,我们也都转成相应的int类型的数组来进行处理。嗯,Int类型的数组这个指令来进行处理,OK,这块呢,大家就清清楚这个问题就可以了,本身这个事儿呢,其实也不是特别难理解,像包括咱们讲这个第一章的时候。讲第一章的时候,咱们提到过这个是不是这个常量池这块对吧。嗯,回忆一下咱们是在哪说到的啊。
07:02
嗯,不在这儿,咱们说常量池。嗯,常量池表吧,在这儿对吧,常量池表的时候呢,我们提到了常量池里边,你不是说有这个常量池表里边有一个一个的数据嘛,这个数据的话呢,也有具体它的一个类型,大家看这个类型的时候呢,咱们当时也说过,是不是没有见到说constant有BA的,有char的,有这个short的,有布尔的,是不是都没有啊,那其实呢,它就相应的都可以看到是我们integer这样的一个结构。啊是没问题的,那跟我们现在这里边讲的这个事儿呢,可以理解成呢,是一脉相承的,啊这就可以了,好,然后这呢是我们说的这个事儿,然后呢,再下来呢,就是咱们具体的要展开讲,大家会看到我们下边有一个分类,关于咱们要讲的这么多指令呢,分成了这样的九类。有加载与存储相关的,有算术相关的类型转换的等等等等等,那么这些指令呢,就是咱们接下来一一呢来给大家进行介绍啊,方便呢,大家后边学习的时候呢,也有一定的规律性啊,像这一个事儿,然后说在前面呢,就是当我们把这些指令呢,都讲完之后呢,大家会发现呢,有这样的一些特点。
08:07
咱们其实好多这些指令的操作比较多的呢,都是针对这个操作数占的啊,这个操作占呢,这也是咱们上篇当中讲到的具体的这个内存。的一个具体结构了,对吧。准确的说的话,应该是我们这个站里边的一个叫操作数站这样的一个位置,那很多数据,那可能是从局部变量表里边儿,可能是从常量池里边,比如说我们一个字符串等等的,对吧,那也可能是堆中的这个对象或者方法调用啊,系统调用啊等等,我们获取到的这个数据,把这个数据呢,我们压入操作入站。这个是入站的一个操作,这个提到的站呢,就是操作数站,OK,那还会涉及到呢,我们从这个操作站中把这个数据呢给大家取出来,比如说pop多次泡呢,也是我们下边要讲的一个指令。啊,Pop的话呢,就是取出来,然后做一个这个运算,然后呢,当前你取出来这个数据呢,我们就discard是吧,就这个废弃了,那完成赋值加减乘除等等,然后甚至你还可以再存到我们这个操作站当中,主要呢,我们针对的其实跟这个操作数占都比较多一些啊,咱们下边一讲呢,大家就明确了,OK,行这呢就是咱们也算是一个整体的概述啊,最后呢,做一个小结,就是大家在这个。
09:15
笔试面试的时候,这个应该说呢,不会问到大家,具体的说,你知不知道关于加载与存储相关的指令有哪些啊,这个基本上现在面试的时候还没有人去问到这个层面啊,还不至于说现在GM面是面到这么夸张的这个程度啊,但如果说真的问到了,那就说明呃,这个公司呢,应该是比较大的公司了啊,因为它涉及到自己搭建虚拟机啊,需要自己呢做一些这个这个开源的,我们比如说Oracle官方open jdk给我们提供的这个虚拟机,它的一个改造对吧,那改造的时候呢,它就需要呢,诶你得懂这些具体的指令。反正又说比较高端一些了,那正常来讲呢,如果大家只涉及到一些调优相关,那大家呢,顶多就是看看这些指令,然后呢,你知道对应的代码有哪些,底层的实现是什么样子,还有没有优化的空间,也就到此为止,面试的时候基本还不会目前啊问到这些具体细节的指令。
10:05
行,那接下来的话呢,咱们就来具体讲解这些指令。
我来说两句