Java中对象与非静态变量的内存分配相关问题咨询
结论先行:系统会给对象分配真实的内存地址,对象本身有实际的内存存储空间,不是仅用来访问变量的虚拟概念。
给你举个很好理解的生活类比:
你写的Java类就相当于一张「户型设计图」,你在类里定义的int a这类非静态变量,就相当于图纸上标注的「卧室」「书房」这类功能区——图纸只是告诉你这套房子应该有哪些空间,但本身不是实际的房子。
你每执行一次new 类名()创建对象,就相当于拿着这张图纸实际盖了一套房子:
- 每套盖好的房子都有唯一的门牌号,这就是系统给对象分配的真实内存首地址
- 每套房子里的卧室、书房都是完全独立的,你往A家卧室放东西,完全不会影响B家的卧室,这就是老师说的
obj.a和obj1.a互不干扰的原因
内存分配的实际逻辑也和盖房子逻辑一致:
- 创建对象时,系统首先会在堆内存区域划出一块连续的空闲空间,给这个新对象使用,这块空间有自己唯一的内存地址
- 接下来系统会把当前类定义的所有非静态变量,按固定规则存到刚才给对象划好的这块空间里,每个变量在对象的整体空间里都有自己的小偏移位置
- 你代码里写的
obj本质是存在栈里的一个「引用标识」,它存的就是这个对象的内存首地址,你调用obj.a的时候,系统会先找到obj存的首地址,再按a对应的偏移位置定位到变量的实际存储位置,就能完成读写操作了
补充个你现在不用深究但可以了解的小知识:对象的内存空间里除了存你定义的非静态变量,还要存一些Java运行需要的底层信息(比如对象所属的类信息、锁状态信息等),这些内容都是真实占用内存的,也进一步说明对象不是虚拟概念。
内容的提问来源于stack exchange,提问作者bruhmoment
相关产品推荐
相关产品推荐

