Java中请问将一个对象赋值给另一个同类对象,这两个对象是否指向同一堆内存?
如题,再请问,改变前一个对象的成员变量,后一个对象的成员变量会改变吗?那么如果会,那sun公司的这种设计有什么实际意义吗?我实在想不明白这种设计有什么意义(前提是我前面用一个对象构造另一个对象,它们指向同一堆内存的这一假设成立、我这没有环境,所以没办法试,要不我就自己先试一试了)、比如有一个类:Person,我现在有两个对象,比如说双胞胎兄弟,我初始化了哥哥,这个对象,我现在想用哥哥去构造弟弟、弟弟和哥哥其它都一样,只是脸上多颗痣,但是如果赋值之后,它们指向同一堆内存的话,改变弟弟这一对象的成员变量(脸上有痣为true),那哥哥不也有痣了吗?就达不到要的效果啦、怎么理解?怎么解决这种问题?
是的。
对象是引用类型的,所以如果把一个对象赋值给另一个变量,它实际上只是把内存地址赋值了。也就是说,如果对象都是同一地址,那么改变该地址的值,另外一个同地址的对象也会改变。
首先可以使用构造器的参数区别开两个对象,如果要直接赋值而不互相影响,那么可以使用clone(浅复制、深复制包含内部引用等)方法如
Person newPerson=(Person)oldPerson.clone()
;这样新旧对象是2个对象而不是共用一个地址的2个对象。
堆和栈
内存管理在Java语言中是JVM自动操作的,当JVM发现某些对象不再需要的时候,就会对该对象占用的内存进行重分配(释放)操作,而且使得分配出来的内存能够提供给所需要的对象。
在一些编程语言里面,内存管理是一个程序的职责,但是书写过C++的程序员很清楚,如果该程序需要自己来书写很有可能引起很严重的错误或者说不可预料的程序行为,最终大部分开发时间都花在了调试这种程序以及修复相关错误上。
对象是引用类型的,所以如果你把一个对象赋值给另一个变量,它实际上只是把内存地址赋值了。
也就是说,如果你的对象都是同一地址,那么改变该地址的值,另外一个同地址的对象也会改变。
比如
List a = new ArrayList();
a.add("a");
List b=a;
b.add("b");
System.out.println(a);
//output:[a,b]
这里边的a、b就是同一地址;
但是有赋值的则不会如此:
String a="a";
String b=a;
b="b";
System.out.println(a);//output:a
这里边b的引用虽然指向了a但是后来的赋值让它指向了新的地址,改变的不是原来地址的值;所以a没有改变。