更改对象值

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


例如说我有以下课程:


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


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


梦里花落0921
浏览 124回答 2
2回答

料青山看我应如是

让我们在这里看看 Listget()方法的 Javadoc&nbsp;:返回此列表中指定位置的元素。根据文档,它返回存在于指定位置的元素并且不创建新实例。您得到的是位置 3 处元素的引用。因此,当您进行更改时,它会应用于现有元素,因为我们没有在此代码中的任何位置创建任何新元素(在代码)。

犯罪嫌疑人X

MultisetPair&nbsp;pair&nbsp;=&nbsp;multiset.get(3); pair.setCardinality(pair.getCardinality()+1);这不仅改变了我刚刚创建的对的基数,它还会使 multisetpair(3) 处的对的基数大一。因为这两个对象……是同一个对象。上面没有两个对象。您有一个局部变量pair,它在位置 3 处引用列表的内容。这就是全部内容。当你把一个鸡蛋放进一个盒子里,然后你把盒子打开,然后你选择那个盒子里的第三个鸡蛋,然后给它上色……然后那个盒子里的第三个鸡蛋就上色了。换句话说:你可以有多个指向同一个底层对象的引用。您使用哪个引用来访问该对象并不重要,只要您更改该对象的状态,该对象就会更新。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java