“这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战”
引言
今天是第6天,上回说到对象创建后都包含哪些信息,但是我们创建对象的目的是干什么呢?(正经一点),当然是为了使用啊,那么问题是我么怎么找到它呢,嘻嘻,今天我们就来聊聊对象的访问,大家开不开心,你们不开心我可开心,因为明天就是周六,今天是周五。我对工作的态度是:有什么事都可以挪到下周一(本王子要度过愉快的周末)。
对象的访问定位
在java中,我们是通过栈上的reference来操作对象,《Java虚拟机规范》定义了两种类型:一种是基本类型,一种是引用类型,但没有规定引用类型是以什么方式去访问对象的位置的,所以访问方式是由虚拟机自己定义实现的,一般的,有以下两种访问方式:
- 使用句柄
- 直接指针
使用句柄
如果使用句柄访问的话,Java堆会专门分配出一个内存空间来作为句柄池,reference中存储的就是对象的直接地址,只不过这个地址会放在句柄池中存储,可能有点懵,大家千万别被关键词搞怕了,没事我来梳理一下流程:就是我要找对象,先找栈上的reference,然后reference说了,我只知道句柄池中的地址,你去句柄池找吧,然后我到了句柄池,句柄池说了,我知道实例池和类型池的地址,看看是不是你想要的,我到了实例池和类型池一看,就是它。
优点:这样访问的好处是,无论对象在哪,哪怕它上房揭瓦,我reference都不用动,直接修改句柄池中的位置就可以了。
直接指针
理解了上面的这个就简单了,就是直接在reference中存储对象的地址
优点:优点就是访问速度快啊,节省开销。由于java对象非常多,这种节省也是一大笔成本呢,谁也不喜欢败家子啊!
题外话
我想从一开始不会写文章,但现在已经第6天了,我成长了,你呢?最后感谢掘金,我们一起加油!