在Java中具有以下代码
public Polynomial multiply(Polynomial aPolynomial){
Polynomial ret = new Polynomial();
for (Tuple i: this.pol){
Polynomial temp = aPolynomial.clone();
System.out.print(temp);
for (Tuple j: temp.pol){
j.setCoef(j.getCoef() * i.getCoef());
j.setPower(j.getPower() + i.getPower());
}
ret = ret.add(temp).clone();
}
return ret;
}
我得到的输出System.out.print(temp)
始终是不同的值。这意味着aPolynomial
在运行时某个地方会更改get。
更改Polynomial temp = aPolynomial.clone();
为:
LinkedList<Tuple> list1 = (LinkedList<Tuple>) aPolynomial.pol.clone();
Polynomial temp = new Polynomial(list1);
System.out.print(temp)
对于循环的每次运行也有所不同,这也无济于事。
我的错误在哪里?
编辑:
public Polynomial clone() {
try {
return (Polynomial)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
打印hashCode()
的temp
和aPolynomial
确实导致两个不同的值。
aPolynomial
hashCode
在for
循环的每次运行中都具有相同的功能。
评论中某些问题的答案:
因为Polynomial
它不会从任何地方继承,就我而言,我super.clone()
会提到Object
我有自己的toString
方法。
我相信您遇到的问题是:您已验证temp
的克隆aPolynomial
实际上是一个单独的对象。但是您在该对象中使用的值在参考中temp.pol
。在clone方法期间,该引用将被复制到新Polynomial
实例,以便两者aPolynomial
和temp
使用其pol
成员引用同一对象。
最简单的解决方案是实现自定义clone()方法,在此方法中,您还可以克隆pol
对的新实例的引用Polynomial
。
类似于以下内容:
public Polynomial clone() {
try {
Polynomial p = (Polynomial)super.clone();
p.pol = this.pol.clone();
return p;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句