Java关于对象范围和对象的修改

时间:2013-06-11 18:09:47

标签: java arrays object scope

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

//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中的对象? 对不起这个愚蠢的问题。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

你是对的:你从HashMap中检索到的对象内部的任何更改都将在HashMap中更改,就像从任何数据结构中检索对象一样,你实际上得到了一个指向对象的指针,所以HashMap和你得到的指针都指向相同的对象数据。唯一不同的是,如果要存储基元(如int,double,float等),或者重建从HashMap接收的对象。