为什么clone()不能按预期工作?

Ale*_*sie 4 java clone

在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;
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出System.out.print(temp)总是不同的值.这意味着aPolynomial在运行时期间某处改变了get.

更改Polynomial temp = aPolynomial.clone();到:

LinkedList<Tuple> list1 = (LinkedList<Tuple>) aPolynomial.pol.clone();
Polynomial temp = new Polynomial(list1);
Run Code Online (Sandbox Code Playgroud)

System.out.print(temp)在每次循环运行时,输出也没有帮助.

我的错误在哪里?

编辑:

public Polynomial clone() {
    try {
        return (Polynomial)super.clone();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

打印hashCode(),tempaPolynomial确实产生两个不同的值.

aPolynomialhashCode在每次for循环运行时都有相同的功能.

回答评论中的一些问题:

既然Polynomial不会从任何地方继承,据我所知,super.clone()将参考Object

我有自己的toString方法.

Nem*_*X00 6

我相信您遇到的问题是:您验证temp了克隆aPolynomial,实际上是一个单独的对象.但是您从该对象使用的值在引用中temp.pol.在克隆方法期间,该引用被复制到新Polynomial实例,以便它们aPolynomialtemp它们的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;
}
Run Code Online (Sandbox Code Playgroud)