我有一个问题,我猜对象的范围以及对象所持有的值是否会在某些条件下被更改。 例如,我创建了一个类,其中我需要构造对象的多个实例,但是这些实例需要在整个程序中使用和修改,并且在第一个实例之后不应该创建新实例(我不是知道如果有的话,这会是什么样的设计模式。我设计对象的方式类似于以下内容:
//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”); 它似乎可能是创建该类的新实例或只是复制它,并且对该对象1对象的任何更改都不会对HashMap中的对象进行。
我是否更正了对从HashMap获取的对象的任何值所做的更改将被放回到HashMap中的对象? 对不起这个愚蠢的问题。
答案 0 :(得分:2)
Java是按值传递的,但是MyObject
是一个引用,它是按值传递的。
这意味着对象的引用的每个副本都是同一个对象,无论您何时尝试更改它,都会更改相同的对象。
只有在复制对象时才会复制对象本身,而不是隐式复制。
答案 1 :(得分:1)
你是对的:你从HashMap中检索到的对象内部的任何更改都将在HashMap中更改,就像从任何数据结构中检索对象一样,你实际上得到了一个指向对象的指针,所以HashMap和你得到的指针都指向相同的对象数据。唯一不同的是,如果要存储基元(如int,double,float等),或者重建从HashMap接收的对象。