0

我有一个问题,我猜对象的范围以及对象持有的值是否会在某些条件下改变。例如,我创建了一个类,我需要在其中构造多个对象的实例,但是这些实例需要在整个程序中使用和修改,并且在创建第一个实例后不应再创建新实例(我不不知道这将遵循什么设计模式(如果有的话)。我设计对象的方式类似于以下内容:

//basic constructor class
public class MyObject {

private String var1;
private int var2;
private boolean vr3

public MyObject(String param1, int param2, boolean param3) {
    var1 = param1;
    var2 = param2;
    var3 = param3;
}

//getter and setter methods

}

//in main class
Map<String, MyObject> myObjects = new HashMap<String, MyObject>();

在我的程序开始时,我搜索了一些文件以构造新的 MyObject 对象,然后将它们放入 HashMap 中,这是唯一应该创建新的 MyObject 的时间。因此,在整个程序中,我通过获取与 String 键匹配的值来获取 HashMap 中的对象,一旦我拥有该对象,我可以使用不同的 setter 方法对其进行处理,如下所示:

MyObject object1 = MyObjects.get("anObject");

object1.setVar1("这是对象的新 var1 字符串值");

上面的代码应该更改键“anObject”下的 HashMap 中对象中的字符串值。但我想知道这是否也适用于列表之类的东西?比如说我有一个列表作为对象中的值之一,如果我从 HashMap 中获取该对象,并调用类似:

object1.getList().add("new value in the object1 list"); 

这会将值添加到 hashMap 中的对象吗?我想知道这是因为因为我调用了: MyObject object1 = MyObjects.get("anObject"); 似乎它可能正在创建该类的新实例或只是将其复制过来,并且对该 object1 对象的任何更改都不会对 HashMap 中的对象进行。

我是否正确,对从 HashMap 获得的对象的任何值所做的更改将被放回 HashMap 中的对象?对不起这个愚蠢的问题。

4

2 回答 2

2

Java 是按值传递的,但MyObject它是一个引用,它是按值传递的。

这意味着对您的 Object 的引用的每个副本都是同一个对象,并且无论您尝试更改它的任何位置,都会更改相同的对象。

对象本身只会在您复制时被复制,而不是隐式复制。

于 2013-06-11T18:13:18.700 回答
1

你是对的:对从 HashMap 检索到的对象内部所做的任何更改都将在 HashMap 中更改,因为当您从任何数据结构中检索对象时,您实际上得到的是一个指向对象的指针,因此 HashMap并且您返回的指针都指向相同的对象数据。唯一不同的情况是,如果您正在存储原语(如 int、double、float 等),或者如果您重建从 HashMap 接收到的对象。

于 2013-06-11T18:13:34.583 回答