我遇到了这个问题,这一直让我发疯。简而言之,我实例化了同一个类的两个对象。当我在一个对象中运行一个方法时,另一个对象也会受到影响,就好像我在第二个对象上显式调用了一个方法一样。我想知道是否有人可以帮我解决这个问题。
假设,我有课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
into pCopy
:
Portfolio pCopy = new Portfolio(p);
所以此时我有两个相同的对象。还有一个是按值复制的对象。更改 中的字段值pCopy
不会影响 中的相同字段p
。
现在,当我在 上运行一个方法applyStress
时p
,仪器列表中的值pCopy
也会发生变化。
换句话说,如果p.portfolio.get(0) == 1
,那么在 之后p.applyStress
,我希望看到p.portfolio.get(0)
is2
和pCopy.portfolio.get(0)
is1
但我看到的p.portfolio.get(0)
是现在2
也是pCopy.portfolio.get(0)
2
我不明白为什么会这样。这不是static
修饰符问题,因为没有静态修饰符。有人有什么想法吗?