jvm实例变量分配内存疑惑

w1215142854 2016-10-17 10:45:14
public class Test{
Test test=new Test();

对于test这个变量,从jvm开始加载Test.class文件开始,test这个变量是何时被分配内存的?被放在了内存的哪个区域?
...全文
203 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
放纵青春丶 2016-10-19
  • 打赏
  • 举报
回复
引用 4 楼 qq_36440681的回复:
我觉得应该是初始化的时候常量池中已经有了5,int a 复制的时候就直接从常量池中读取了5的内存地址,然后你在创建对象的时候,对象直接引用了常量池中的内存地址,所以两个相等。
答错地方了..尴尬......
放纵青春丶 2016-10-19
  • 打赏
  • 举报
回复
我觉得应该是初始化的时候常量池中已经有了5,int a 复制的时候就直接从常量池中读取了5的内存地址,然后你在创建对象的时候,对象直接引用了常量池中的内存地址,所以两个相等。
w1215142854 2016-10-18
  • 打赏
  • 举报
回复
问题已搞清,特来结贴: test这个变量在jvm加载类的过程中会被读取并被放到方法区,而赋值动作会在创建类的实例时进行
w1215142854 2016-10-17
  • 打赏
  • 举报
回复
引用 1 楼 baohuan_love 的回复:
类里定义的类对象,不管是不是本身类,都是实例化类对象时,才会实例化类里的成员,先实例类里的成员变量,最后构造出类对象本身,所有new出来的对象都存在内存的堆区。
不知道你又没有看过jvm,jvm加载一个class文件时分为“加载”、“准备”、“初始化”等阶段,在“初始化”阶段会给类变量初始化,也就是执行类变量的赋值语句,那么Test test=new Test();这句代码在什么时候执行呢?
  • 打赏
  • 举报
回复
类里定义的类对象,不管是不是本身类,都是实例化类对象时,才会实例化类里的成员,先实例类里的成员变量,最后构造出类对象本身,所有new出来的对象都存在内存的堆区。

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧