gpt4 book ai didi

java - 方法针对类的所有实例运行

转载 作者:行者123 更新时间:2023-11-30 07:25:39 24 4
gpt4 key购买 nike

我遇到了这个问题,这让我抓狂。简而言之,我实例化了同一个类的两个对象。当我在一个对象中运行一个方法时,另一个对象也会受到影响,就好像我在第二个对象上显式调用了一个方法一样。我想知道是否有人可以帮我解决这个问题。

假设,我有类 Portfolio...

public class Portfolio implements Cloneable {

public ArrayList<Instrument> portfolio;
private String name;
private String description;

public Portfolio() {
portfolio = new ArrayList<Instrument>();
}

public Portfolio(Portfolio copyFrom) {
//attempt to copy the object by value
this.portfolio = (ArrayList<Instrument>) copyFrom.portfolio.clone();
this.name = copyFrom.name;
this.description = copyFrom.description;
}

public void applyStress(Stress stress) {
this.portfolio.set(0,this.portfolio.get(0)+1;
}

第一个构造函数用于实例化对象等。第二个构造函数用于按值复制对象。

applyStress 方法用于运行总和计算。在我们的例子中,我简化了该方法,因此它除了向对象中的任何内容添加 +1 之外什么都不做。

所以我会将一个对象实例化为

Portfolio p = new Portfolio();

然后我会分配给一个 portfolio 字段,一些工具;

p.portfolio = someInstrumentList;

然后我将按值将 portfolio p 复制到 pCopy 中:

Portfolio pCopy = new Portfolio(p);

所以此时我有两个相同的对象。还有一个是按值复制对象。更改 pCopy 中字段的值不会影响 p 中的相同字段。

现在,当我在 p 上运行方法 applyStress 时,pCopy 中的仪器列表的值也会发生变化。

换句话说,如果 p.portfolio.get(0) == 1,那么在 p.applyStress 之后,我希望看到 p .portfolio.get(0)2pCopy.portfolio.get(0)1

但我看到的是 p.portfolio.get(0)2pCopy.portfolio.get(0) 是还有 2

我不明白为什么会这样。这不是 static 修饰符问题,因为没有 static 修饰符。有人有什么想法吗?

最佳答案

应用于您的 ArrayList 引用的克隆方法执行 shallow copy , 不是 deep copy .这意味着您在原始集合中拥有的任何内容都由克隆集合共享。

这意味着您还需要克隆每个乐器,或者为每个乐器提供一个复制构造函数。

this.portfolio = new ArrayList<Instrument>();
for(Instrument toBeCopiedInstrument : copyFrom.portfolio){
this.portfolio.add(new Instrument(toBeCopiedInstrument ));
}

关于java - 方法针对类的所有实例运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10808453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com