Java 更改对象值

Java 更改对象值,java,list,object,Java,List,Object,我为你在不实际使用操作的情况下改变对象中的字段而烦恼 例如,假设我有以下课程: public class MultisetPair { private Object element ; private int cardinality ; public MultisetPair(Object element) { this.element = element ; cardinality = 1 ; } public Objec

我为你在不实际使用操作的情况下改变对象中的字段而烦恼

例如,假设我有以下课程:

public class MultisetPair {
    private Object element ;
    private int cardinality ;
    public MultisetPair(Object element) {
        this.element = element ;
        cardinality = 1 ;
    }
    public Object getElement() {
        return element ;
    }
    public int getCardinality() {
        return cardinality ;
    }
    public void setCardinality(int cardinality) {
        if(cardinality < 1)
            throw new IllegalArgumentException();
        this.cardinality = cardinality ;
    }
}
这不仅改变了我刚刚创建的对的基数,还将使multisetpair(3)处的对的基数增加1

为什么呢?它不应该只改变我创建的一对而不是实际的一对吗

谢谢

MultisetPair pair = multiset.get(3);
pair.setCardinality(pair.getCardinality()+1);
这不仅改变了我刚刚创建的对的基数,还将使multisetpair(3)处对的基数增加1

因为这两个物体。。。是相同的对象。上面没有两个物体。您有一个局部变量
,它引用列表中位置3处的内容。这就是一切

当你把一个鸡蛋放进一个盒子里,让盒子开着,然后选择盒子里的第三个鸡蛋,并给它涂上颜色。。。然后那个盒子里的第三个鸡蛋被涂上颜色


换句话说:您可以有多个指向同一底层对象的引用。无论您使用哪个引用来访问该对象,只要您更改该对象的状态,该对象就会更新。

让我们看看Javadoc of List的
get()
方法:

返回此列表中指定位置的元素

根据文档,它返回指定位置的元素,并且不创建新的实例。您得到的是位置3处元素的引用。因此,当您进行更改时,它将应用于现有元素,因为我们在代码中的任何地方都没有创建任何元素(代码中没有构造函数调用)

MultisetPair pair = multiset.get(3);
pair.setCardinality(pair.getCardinality()+1);
MultisetPair pair = multiset.get(3);
pair.setCardinality(pair.getCardinality()+1);