为了账号安全,请及时绑定邮箱和手机立即绑定

更改对象值

更改对象值

梦里花落0921 2022-06-23 19:21:38
我对你可以更改对象中的字段而不实际使用它们的操作的方式感到困扰。例如说我有以下课程: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 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

让我们在这里看看 Listget()方法的 Javadoc :

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

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


查看完整回答
反对 回复 2022-06-23
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

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

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

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

当你把一个鸡蛋放进一个盒子里,然后你把盒子打开,然后你选择那个盒子里的第三个鸡蛋,然后给它上色……然后那个盒子里的第三个鸡蛋就上色了。

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


查看完整回答
反对 回复 2022-06-23
  • 2 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信