改变对象的价值

问题描述 投票:1回答:2

我对您可以更改对象中的字段而不实际使用它们的操作的方式感到困扰。

例如说我有以下课程:

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)中的对的基数大一。

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

谢谢你。

java list object
2个回答
1
投票
MultisetPair pair = multiset.get(3);
pair.setCardinality(pair.getCardinality()+1);

这不仅仅改变了我刚刚创建的对的基数,它还会使多重对比(3)中对的基数大一。

因为这两个对象......是同一个对象。上面没有两个对象。你有一个局部变量pair,它引用你在第3位的列表内容。这就是它的全部内容。

当你把一个鸡蛋放入一个盒子里,然后你把盒子打开,然后你选择那个盒子里的第三个鸡蛋,并给它上色......然后那个盒子里的第三个鸡蛋变成了颜色。

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


1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.