首页 新闻 搜索 专区 学院

jvm实例变量存放位置问题

0
悬赏园豆:80 [待解决问题]

假设有如下代码:
1、实体类Animal:
class Animal{
private Integer eye;
private Integer leg;
private String name;

// 以下省略代码 get 和 set 方法...

}
2、main方法中使用:
Animal animal = new Animal();
animal.setEye(2);
animal.setLeg(2);
animal.setName("tom");

问题:关于实例变量eye、leg、name在jvm中,变量和对应的值存放位置应该是怎样的呢?附上一张图,是我的理解,欢迎各位老师和同学帮忙解答和指正。
eye和leg是实例变量,所以和实例一起放在堆中(变量和对应的值都在堆中)。
而name是String,由于在String类内部加了final,所以它实际是常量,所以name实例变量放在堆中,而name对应的值“tom”放在常量池中。

java12345_com的主页 java12345_com | 初学一级 | 园豆:124
提问于:2020-06-24 17:37
< >
分享
所有回答(2)
0

如果你用的是Integer的话,它们还是对象,单独在堆里开辟空间的

yytxdy | 园豆:1065 (小虾三级) | 2020-06-24 17:41

如果是int(基本数据类型)呢,就会直接放在堆中是吧?其它的,我理解得怎么样,是正确的吗?

支持(0) 反对(0) java12345_com | 园豆:124 (初学一级) | 2020-06-24 17:43

@java12345_com: int的话,差不多,不过eye和leg也不是共享一个值,还有堆里只有值,没有变量的说法

支持(0) 反对(0) yytxdy | 园豆:1065 (小虾三级) | 2020-06-24 17:55

@yytxdy: 如果堆里面没有变量,那么实例的属性(变量)放在哪的呢?“int的话,差不多,不过eye和leg也不是共享一个值”那么它们的值应该是怎么存放的呢?

支持(0) 反对(0) java12345_com | 园豆:124 (初学一级) | 2020-06-29 14:51

@java12345_com: 属性在class文件里啊,eye和leg各自有各自的内存空间呗

支持(0) 反对(0) yytxdy | 园豆:1065 (小虾三级) | 2020-06-30 09:06
0

原始数据类型变量:
原始数据类型变量的“变量分配”与“数据分配”是在一起的(都在方法区或栈内存或堆内存),除非加了final修饰(放在常量池)。

引用数据类型变量:
引用数据类型变量的“变量分配”与“数据分配”不一定是在一起的。

对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。

java12345_com | 园豆:124 (初学一级) | 2020-06-30 10:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册