00:00
那关于对象这块呢,我们来看最后一个问题,关于对象的一个访问定位啊,这样一个问题,那我们这呢,也有一个对应的脑图啊,一会呢,咱们来看这呢,主要我们想说明这两个问题,说呢,扎逊尼是如何通过战争中的对象引用访问到其内部对象的实力的呢?啊,咱们说呢,呃,比如说刚才咱们写的这个程序,咱呢造的这个对象呢,呃,是在我们这个方法的这个战争当中,这呢其实就是战争当中的一个局部变量,对吧?那么这个局部变量的话呢,我们这个怎么着就能访问到你堆空间中的这个对象实例了呢?啊,以及堆空间中的对象实例怎么去找到这个方法区的这个,呃类源数据呢,类源信息呢,对吧?是这样问题,实际上呢,这个答案呢,也非常简单,就是通过我们这个战争当中这个局部变量,或者说呢,我们这个对象的这个引用呢,是不是记录了我们堆空间中你造的这个对象的一个地址值啊,诶把这个地址值呢,赋给了我们战争当中的这个对象引用啊,就能够直接找过来了。行,那这呢,咱们就直接来看咱这的这个叫诶思维导图啊,找一下看这图在哪。
01:03
啊,在这是访问定位。好,那我们来看一下。行,那首先的话呢,这块这个图示就是我们刚才看那个情况啊,说呢,我们创建对象的目的啊,就是为了使用它啊,毫无疑问是吧?诶找对象的目的呢,我们是通过这对象呢,要去调它相关的一些功能,完成咱们整个项目的一个设计啊,那么刚才说的这个问题,怎么能通过这个呃引对象引用呢,找到我们这个对象实体呢?诶就是通过我们这个站上的这个引用这样一个变量啊访问就可以了,那么具体的这个实现方式啊,我们说有两种情况,这个大家关注一下啊,就是我们重心的实际像在这儿,那对象访问的两种方式,一个呢叫做句柄访问,一个呢叫做直接指针。啊,句柄访问和这个直接指针啊,这样两种方式对应的这个图示呢,就是我们下边这块有啊这呢叫句柄访问。啊,然后呢,这个呢叫使用直接指针啊,这样两个图,那我们这儿呢,还是直接来看这个也可以啊,那什么叫句柄访问,我在这儿呢,把这个图呢又拿过来了。
02:01
大家来看一下,就这样个情况,我们这个占的这个本地变量表,或者叫局部变量表里边记录了我们这个对象引用啊,这个引用的话呢,我们这个要想访问的话啊,这是我们叫聚柄访问是吧,在我们这个堆空间啊,啊,咱们呢,开辟了一块区域,这个区域呢叫做聚柄池。专门有个区域呢,叫聚柄池,放了很多的这个聚柄啊,一个对象呢,对应的有一个聚柄,这个聚柄呢,它有两个信息,第一个呢,一个呢是记录我们说到对象实例数据的一个指针啊,那这个实例数据呢,我们说是new对象就在我们这个对空间当中啊,就指向它了,另外一个呢,就是指向了到对象类型数据的一个指针,指向了我们方法驱动的这个叫类元数据。啊,就是这样的情况。啊,这是呢,是其中的一种叫做句柄访问是吧,然后还有一种呢,叫做直接指针,直接指针呢,是这样子的啊,就是我们这个占空间呢,这是这个引用,这个引用的话呢,指向我们对空间,你这个对象实体,直接呢就指向了我们这个对象实体了。哎,然后的话呢,在我们这个对象实体当中,有一个类型指针指向了咱们这个,呃,方法区中的这个内源数据。
03:08
大家看到这个情况呢,是不是非常眼熟是吧?诶是不是跟我们刚才那会儿呢,讲到这个图呢,是一致的呀,我们这儿呢,是一个cast这样的一个对象引用指向了我们对空间中呢,你整个这个对象的一个呃内部结构是吧,然后呢,在这个对象这个实体里边啊,对象头里边有一个类型指针指向了我们一个方法区,其实这个图呢,就跟咱们刚才说的是不是这个图是二是一样的的呀。啊,没问题啊,那为什么们这块提到两种方式啊,主要原因呢,是因为咱们Java虚拟机当中,它并没有明确的啊,Java虚拟规范当中啊,并没有明确的去说,呃,我们应该采用哪一种方式,那既然呢,Java虚拟规范中没没有明确说,那这时候呢,具体的虚拟机的话呢,它的采用的方式呢,就不太一样了,那这里边我们要强调的就是house house呢,采用的就是我们看到这个第二种方式。那么,这两种方式有哪些优缺点呢?那么大家通过这两个图呢,你看能不能分辨出来。
04:03
有什么优缺点啊?那对于咱们这个叫句柄访问来讲哈,大家看我是不是专门的得开辟一个空间是吧,叫做句柄,首先呢,这个从空间上呢,稍微浪费一点,那其次的话呢,我们要想访问你这个对象的话呢,是不是先从这个引用找到这个句柄,句柄里边呢,又有一个变量呢,来记录你这个,诶对空间中你这个对象实体是不是说这样访问的话呢,效率比较低啊。而我们下边的这个,哎,咱这个的话呢,是不是直接呢,通过占空间呢,你这个对象引用就一步到位就访问到对空间这个对象实体了,是吧?哎,就是从这个角度上来讲的话呢,咱们这个第二种方式呢,显然呢,效率是要高一些,而且的话呢,我们也没有专门的是不是去记录,呃,你这个聚柄是吧?啊没有像我们这上面呢,还专门开辟一个空间来记录个聚柄,所以从这两个角度上来讲呢,聚柄访问的方式要差一些,而我们这个直接指定的方式呢,是不是要好一些,节省空间还速度快。
05:02
好理解是吧,那么有优点有优点吗。咱刚才光说人家缺点了是吧,大家能想到它有什么样的优点吗?优点是吧?呃,优点呢,是这样子的啊,你看我这块写的它这个好处啊,就是我们在使用这种方式的时候呢,诶这个我们在占空间维护的这个这个对象营的这个地址啊,它是很稳定的啊,我们如果说堆空间中的你这个对象呢,发生了移动啊,大家想啊,如果我们这个对象发生了移动,这个对象还是它,但是它的位置变了,那这个时候呢,正常来说,既然位置变了话呢,这个位置是不是要改一下是吧,但是我们这个引用的地址呢,就不用做修改了。它呢,就永远指向我们对空间中的你这个句柄,然后是句柄里边这个变量的地址做修改了。那什么时候会移动啊,就是咱们后边呢,讲这个呃叫标记整理算法的时候,哎,我们这个对象呢,它就会产生一些移动,包括呢,大家你想想我们这个S0区,S1区,新零区星增一区,你往这儿移,我往这儿移,是不是这时候呢也会发生一些移动,对吧?那既然你发生移动了,那这时候的话呢,我们这个指针它就会修修改,但是这个呢,就不需要去改了,所以我们对于站空间这个对象引用的地址它是非常稳定的啊,那对于我们第二种方式来讲呢,就呃这个占空间的这个呃地址是不是就要需要做修改了啊,因为你记录的这个对象呢,在垃圾回收的时候呢,它需要做移动,那这个呢就需要跟着修改,这样呢,就算它的一个弊端是吧,但是整体上来讲呢,我们说第二种方式啊,是不是要更优一些,所以呢,咱们houseboard呢,也是采用的这样的一种方式。
06:34
OK啊行,这呢就是咱们所说的这个叫对象访问定位,主要呢是提到这个句柄访问,还有呢,我们这个叫诶直接指针的一个方式,行这两个事儿呢,大家能够听清楚,然后呢,也知道呢,咱们house包虚拟呢,采用的是哪种方式,诶就可以了,行,那这个说完以后呢,诶关于我们这个对象的这个内容啊,咱们就算是告一段落。涉及到呢,叫对象的一个实例化,咱们呢,是不是说了有六个步骤对吧?哎,我这呢写了六个步骤啊,大家呢,也可以把其中的一些步骤呢,给它合并,合并都可以啊,关键的就这几个事儿,你不能少,然后对象的一个内存布局啊,这里边呢,我们提到了有三部分结构是吧,还记得吧,一个呢是我们说的叫对象头。
07:13
啊,对象头,然后实例数据,还有我们这叫堆积填充,关键这个对象头里边这个事呢,说清楚啊,这个面试的时候呢,是不是经常爱问这个对象头里边有什么东西是吧?啊,这是一个啊,然后第三个呢,就是我们这个访问定位啊访问定位的定位的话呢,我们有两种方式啊,一个呢叫句柄访问,一个呢叫直接指针,咱用的呢是这个直接指针啊,这样有一个叫类型指针,这样一个变量在对象图里边记录了它在对空间,呃,这个方法区当中,你这个类的类源信息是吧?OK,行,那么关于对象的这三个事儿呢,咱们就说清楚了。
我来说两句