在 HotSpot 虚拟机中,对象的内存布局分为以下 3 块区域:
对象头( Header ) 实例数据( Instance Data ) 对齐填充( Padding )
###实例数据 实例数据部分就是成员变量的值,其中包括父类成员变量和本类成员变量。
我的疑问是,实例数据这部分(成员变量)是否存的是地址值指向堆中的另一个对象? 由于对象创建应该是先申请内存(对象所需内存的大小在类加载完成后便可完全确定)所以在堆内存中相同类所创建地对象应该是一样大的呀,就拿 hashmap 来说,hashmap 内部维护的 node 数组,在扩容的时候会新建一个数组,并将指针指向他,如果实例数据这部分是存的数组本身的话,根本就没办法扩容了
1
guyeu 2020-04-18 16:38:24 +08:00
成员变量的值显然保存的是引用而不是数据本身。
|
2
secondwtq 2020-04-18 16:42:55 +08:00
你这个问题跟 https://v2ex.com/t/663545 这里的楼主是类似的:混淆了 Primitive 值和 Reference 值
学习 C++ 也可以解决这个问题(其实学 C 就可以,不过 C 太乱了) Primitive 值是可以直接存的,Reference 值始终存的是指向另一个对象的指针。而从底层的角度,把 Reference 当成指针 Primitive 看待,这问题就解决了。 楼主想想就知道如果“A 对象的实例数据部分存的是指向 B 对象的地址”,那么 B 对象的实例数据存在哪里?存一个指向 C 对象的指针?这就一直套娃了 而且楼主明显是知道“新建一个数组,并将指针指向他”的 ... |
3
yangyuhan12138 OP |