Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的对象和引用_Java_Object_Reference - Fatal编程技术网

Java中的对象和引用

Java中的对象和引用,java,object,reference,Java,Object,Reference,在Java中,所有变量都是通过值传递的。 对于对象, 这意味着我们在对象上传递引用。 我对以下情况感到困惑。 假设我们有一个对象图。 一个对象包含对另一个对象的字段引用, 该对象引用了另一个对象,如:user.address.city。 这里有类User的实例, 该实例引用了类地址的实例,该类地址的字段类型为String-city。 现在假设我们有2个用户: User bob = new User(); User mary = new User(); 假设对象“bob”引用了地址对象: Add

在Java中,所有变量都是通过值传递的。 对于对象, 这意味着我们在对象上传递引用。 我对以下情况感到困惑。 假设我们有一个对象图。 一个对象包含对另一个对象的字段引用, 该对象引用了另一个对象,如:user.address.city。 这里有类User的实例, 该实例引用了类地址的实例,该类地址的字段类型为String-city。 现在假设我们有2个用户:

User bob = new User();
User mary = new User();
假设对象“bob”引用了地址对象:

Address bobAddress = new Address();
bobAddress.setCity("New York");

bob.setAddress(bobAddress);
比如说,玛丽和鲍勃开始一起住在一所房子里,他们有相同的地址, 没问题:

mary.setAddress(bobAddress);
现在mary和bob引用了一个address对象。 但有一天他们离婚了,玛丽现在有了另一个地址:

mary.getAddress().setCity("Boston");
这里我们有一个问题: 玛丽改变了她的地址, 但她也改变了鲍勃的地址, 因为它们共享相同的引用

以上所有文字都是我试图以小规模描述我面临的一个大问题: 在将某个对象的引用设置到另一个实例之前,何时应该创建该对象的副本(克隆)? 是否存在一些规则或技术? 我知道不可变对象(例如字符串、整数…)对于这些对象,我们根本不需要考虑这些问题,但是如果我有可变对象呢。
我该如何对待他们?

我认为你的想法是错误的

如果玛丽搬家,那意味着她将去一个新的地址。试着把它放到Java中。您只需为Mary创建另一个地址

在我看来,如果同一个对象是同一个对象,就永远不应该为赋值克隆同一个对象。(您可以进行一些处理计算)


只需减少耦合并使用mary.setAddress(字符串streeName、字符串City、字符串State)。通常一个地址的城市不应该改变,因为街道不能从一个城市移动到另一个城市,因此你甚至不应该有一个setCity()公共方法。

你的问题表明
地址类的设计不好

Address类表示地理位置,并且是固定的。 当一个人移动时, 地理位置不变;相反 ghe个体居住的地理位置发生变化

删除Address的setters并使其成为不可变对象。 当一个人移动时, 您必须执行以下操作之一:

  • 如果个人与另一个人共享现有地址(对象实例),则分配现有引用
  • 如果个人移动到新地址(新对象实例),则将该地址分配给新地址实例

  • 可能比我的答案措辞更好+1@Ajk_P你的答案是正确的,但你可能还没有使用过不变性的概念。这绝对是这个框架的方式。它在高度并发和函数式编程中非常重要。当不变的事物(如地址的城市或日期的年份)在代码中也不变时,生活就会变得更轻松。你完全理解了机制/语言。但是你是对的,你的设计会产生这个问题,因此不起作用。因此,我对设计修正案投了赞成票。