问题描述
publicclassUser{publicStringname="你好";publicStringdihzi="你好";}===========================================//测试类Useru=newUser();System.out.println(u.name==u.dihzi);System.out.println(u.name.equals(u.dihzi));==========================================输出结果truetrue============================================我的问题是,单独看String类,栈和堆我都知道怎么回事,这个就不说了!现在是在User类里的属性又是一个引用类型(String类)的时候,当你newUser()的时候,按理说应该是u在栈里,然后newUser()在堆里开辟一个内存空间,然后存值。但现在属性发现是String类,又是一个引用类型了,那这种情况下,怎么办呢?但可以肯定的是,String类自己肯定是引用变量在栈,对象在堆,这个是一定的,我现在的疑问就是:1把String类的对象在堆里的值,复制一份给User类在堆里的对象吗?2还是说把String类的在栈的地址,复制给User类在堆里的对象?3还是说User类在栈内存里保存的是String类在栈的地址,而不是堆里u对象的地址?也就是说当u.name的时候,我是直接去调用String类。通过上面的结果,我猜3的可能性比较大,因为如果是1,2的话,你可以发现当你newUser()的时候,会分别在堆内存开辟2块地址,一个地址是给name一个地址是给dizhi,这也表明这俩地址显然是不同的!但是我上面u.name==u.dihzi结果确实true这说明比较的肯本不是User类的对象地址,而是String类的对象地址。如果是2的话,虽然对象里有String类的地址,可以去找到String类,但是很麻烦,从User栈里找到堆地址,在根据堆里面的地址找到String栈的地址。。。。那还不如直接在User类的栈地址里直接存一个String类的栈地址,省了很多环节。所以我猜测3的可能性比较大。不知道理解的对不对,求懂的指教下!补充下:我的重点不是问String类的堆栈情况,而是在创建User类对象的时候,开辟的堆空间里保存的究竟是什么呢?因为我知道String类也是一个类,他的引用变量在栈,对象在堆,堆里保存的值,现在User也是一个类,他属性又是一个引用类型,那User的对象在堆里怎么保存这个引用类型?或者说在堆里怎么处理这个引用类型的属性?是保存的String类型里的值?还是保存一个String类型的地址让User对象去调用?
解决方案
解决方案二:
User对象保存在堆中。变量保存内存地址。
解决方案三:
堆里保存的是值(对象)地址(也就是引用)保存在栈中