让我烦恼的是,您可以更改对象中的字段而不实际使用对象上的操作。
例如说我有以下课程:
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)上的对的基数增加一。
那是为什么?它不应该只改变我创建的那对,而不改变实际的那对吗?
谢谢。
答案 0 :(得分:1)
MultisetPair pair = multiset.get(3);
pair.setCardinality(pair.getCardinality()+1);
这不仅改变了我刚刚创建的对的基数,还将使multisetpair(3)上的对的基数增加一。
因为这两个对象...是相同对象。上面没有两个对象。您有一个本地变量pair
,该变量引用位置3上的列表内容。仅此而已。
当您将一个鸡蛋放入一个盒子中时,保持盒子处于打开状态,然后选择该盒子中的第三个鸡蛋并为其着色...然后该盒子中的第三个鸡蛋被着色。
换句话说:您可以有多个引用指向非常相同的基础对象。而且使用哪个引用访问该对象都没有关系,一旦更改了该对象的状态,一个对象就会被更新。
答案 1 :(得分:1)
让我们看一下List的get()
方法here的Javadoc:
返回此列表中指定位置的元素。
根据文档,它返回元素出现在指定位置,并且不会创建新实例。您得到的是对位置3上存在的元素的引用。因此,进行更改时,它将被应用到现有元素,因为我们没有在此代码中的任何地方创建任何 new 元素(代码中没有构造函数调用。