Java中请问将一个对象赋值给另一个同类对象,这两个对象是否指向同一堆内存?

如题,再请问,改变前一个对象的成员变量,后一个对象的成员变量会改变吗?那么如果会,那sun公司的这种设计有什么实际意义吗?我实在想不明白这种设计有什么意义(前提是我前面用... 如题,再请问,改变前一个对象的成员变量,后一个对象的成员变量会改变吗?那么如果会,那sun公司的这种设计有什么实际意义吗?我实在想不明白这种设计有什么意义(前提是我前面用一个对象构造另一个对象,它们指向同一堆内存的这一假设成立、我这没有环境,所以没办法试,要不我就自己先试一试了)、比如有一个类:Person,我现在有两个对象,比如说双胞胎兄弟,我初始化了哥哥,这个对象,我现在想用哥哥去构造弟弟、弟弟和哥哥其它都一样,只是脸上多颗痣,但是如果赋值之后,它们指向同一堆内存的话,改变弟弟这一对象的成员变量(脸上有痣为true),那哥哥不也有痣了吗?就达不到要的效果啦、怎么理解?怎么解决这种问题? 展开
 我来答
Lose凌
2018-03-30 · TA获得超过4599个赞
知道小有建树答主
回答量:42
采纳率:100%
帮助的人:1.9万
展开全部

对象是引用类型的,所以如果你纯扒把一个对象赋值给另一个变量,它实际上只是把内存地址赋值了。

也就是说,如果你的对象都是同一地址盯裤旦,那么改变该地址的值,另外一个同地址的对象也会改变。
比如
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没有改变。

帐号已注销
2021-06-26 · TA获得超过77.1万个赞
知道小有建树答主
回答量:4168
采纳率:93%
帮助的人:165万
展开全部

是的。

对象是引用类型的,所以如果把一个对象赋值给另一个变量,它实际上只是把内存地址赋值了。也就是说,如果对象都是同一地址,那么改变该地址的值,另外一个同地址的对象也会改变。

首先可以使用构造器的参数区别开两个森滑派颤对象,如果要直接赋值而不互相影响,那么可以使用clone(浅复制、深复制包含内部引用等)方法如Person newPerson=(Person)oldPerson.clone();这样新旧对象是2个对象而不是共用一个地址的2个对象。

堆和栈

内存管理在Java语言中是JVM自动操作的,当JVM发现某些对象不再需要的时候,就会对该对象占用的内存进行重分配(释放)操作,而且使得分配出来的内存能够提供给所需要的对象。

在一些编程语言里面,内存管理是一个程序的职此羡腊责,但是书写过C++的程序员很清楚,如果该程序需要自己来书写很有可能引起很严重的错误或者说不可预料的程序行为,最终大部分开发时间都花在了调试这种程序以及修复相关错误上。

以上内容参考:百度百科-java内存模型

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zgh26782000
推荐于2017-11-25 · TA获得超过1453个赞
知道小有建树答主
回答量:788
采纳率:0%
帮助的人:497万
展开全部
对象是引用类型的,所以如果你袭祥把一个对象赋值给另一个变量,它实际上只是把内存地址赋值了,
这就比如 你知道xxx家的地址,然后你告诉了另一个人,这个人也知道了这个地址,但是xxx的家你并没有直接拿给另一个人,所以显而易见,你去xxx家拿东西,另一个人去了会发现少了,
如果悔禅羡像你说的改成直接复制一份给另一个人的话,那么你需要把xxx的家重新盖一套,东西都一样,然后搬碧拍过去交给另一个人,显然这不可能
那么java是面向对象的,它是完全符合面向对象的观点的,正因为你不可能重新盖一套房给人家一样,java也是这样做的
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-03-30
展开全部
= =,赋值就是把一个引用的地址指向了另外一个地址~然后它的值就是这个地址的值。
也就是说,如果你的对象都是同一地御皮址,那么改变该地址的值,另外一个同地址的对象也会改变。
比如
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没有改变。

你的哥哥弟弟必须是两个地址不同的对象
Person brotherA = new Person();
Person brotherB = new Person();
这样的;

如果你一定要弟弟继承哥哥的属性,你可以在Person中实现implements Cloneable接口,并且重写clone方法。然后 brotherB =(Person)brotherA.clone();
这样brotherA和brotherB都一样且改变brotherB/A都不会影镇春差响另外一个。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kak520
2013-03-29 · TA获得超过687个赞
知道小有建树答主
回答量:433
采纳率:0%
帮助的人:441万
展开全部
对象的直橘源接赋值是直接改变内存指向的,的确会出现你上面的情况
如果要构建不一样的对象,那么不能直接使用=号,要使用clone() 方法你的构建哥哥或弟弟的对象的类要覆盖OBJECT的clone()方法,里面将每一个非基本类型的变量圆仔态都进行拷贝,也就相当于重新创建了一个对象。
基本类型的=号赋值是直接重新构建内戚喊存空间的,而非基本类型的对象则是直接改天内存指向。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式