当前位置:编程学习 > JAVA >>

一个类的属性是引用类型,那创建对象时候堆里保存的是地址还是值呢?

public class User {

public String name="你好";
public String dihzi="你好";

}
===========================================
//测试类
User u=new User();
System.out.println(u.name==u.dihzi);
System.out.println(u.name.equals(u.dihzi));
==========================================
输出结果
true
true
============================================
我的问题是,单独看String类,栈和堆我都知道怎么回事,这个就不说了!
现在是在User类里的属性又是一个引用类型(String类)的时候,当你
new User()的时候,按理说应该是u在栈里,然后new User()在堆里开辟一个内存空间,然后存值。
但现在属性发现是String类,又是一个引用类型了,那这种情况下,怎么办呢?
但可以肯定的是,String类自己肯定是引用变量在栈,对象在堆,这个是一定的,我现在的
疑问就是:
1把String类的对象在堆里的值,复制一份给User类在堆里的对象吗?
2还是说把String类的在栈的地址,复制给User类在堆里的对象?
3还是说User类在栈内存里保存的是String类在栈的地址,而不是堆里u对象的地址?也就是说当
u.name的时候,我是直接去调用String类。

通过上面的结果,我猜3的可能性比较大,因为如果是1,2的话,你可以发现当你new User()的时候,会分别在堆内存开辟2块地址,一个地址是给name 一个地址是给易做图 ,这也表明这俩地址显然是不同的!
但是我上面u.name==u.dihzi 结果确实true 这说明比较的肯本不是User类的对象地址,而是String类的对象地址。

如果是2的话,虽然对象里有String类的地址,可以去找到String类,但是很麻烦,从User栈里找到堆地址,在根据堆里面的地址找到String栈的地址。。。。那还不如直接在User类的栈地址里直接存一个String类的栈地址,省了很多环节。

所以我猜测3的可能性比较大。

不知道理解的对不对,求懂的指教下!

补充下:我的重点不是问String类的堆栈情况,而是在创建User类对象的时候,开辟的堆空间里保存的究竟是什么呢?因为我知道String类也是一个类,他的引用变量在栈,对象在堆,堆里保存的值,现在User也是一个类,他属性又是一个引用类型,那User的对象在堆里怎么保存这个引用类型?或者说在堆里怎么处理这个引用类型的属性?
是保存的String类型里的值?还是保存一个String类型的地址让User对象去调用? --------------------编程问答-------------------- User对象保存在堆中。变量保存内存地址。 --------------------编程问答-------------------- 堆里保存的是值(对象)

地址(也就是引用)保存在栈中 --------------------编程问答-------------------- java堆栈解析
补充:Java ,  Java SE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,