更改对象的值

时间:2019-02-18 18:31:20

标签: java list object

让我烦恼的是,您可以更改对象中的字段而不实际使用对象上的操作。

例如说我有以下课程:

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对象的列表,如下所示:

LinkedList<MultisetPair> multilist = new LinkedList<>();

我做类似的事情:

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

这不仅会更改我刚刚创建的对的基数,还会使multisetpair(3)上的对的基数增加一。

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

谢谢。

2 个答案:

答案 0 :(得分:1)

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

这不仅改变了我刚刚创建的对的基数,还将使multisetpair(3)上的对的基数增加一。

因为这两个对象...是相同对象。上面没有两个对象。您有一个本地变量pair,该变量引用位置3上的列表内容。仅此而已。

当您将一个鸡蛋放入一个盒子中时,保持盒子处于打开状态,然后选择该盒子中的第三个鸡蛋并为其着色...然后该盒子中的第三个鸡蛋被着色。

换句话说:您可以有多个引用指向非常相同的基础对象。而且使用哪个引用访问该对象都没有关系,一旦更改了该对象的状态,一个对象就会被更新。

答案 1 :(得分:1)

让我们看一下List的get()方法here的Javadoc:

  

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

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