Java 为什么对象中的一个变量在构造函数中被更改?

Java 为什么对象中的一个变量在构造函数中被更改?,java,Java,我为这个措词拙劣的问题道歉——很难仔细解释 我已经写了3个类-一个表示复数,一个表示具有复数系数的多项式,最后一个对所述多项式执行牛顿-拉斐逊算法以找到根的估计 问题是,当我创建Newton类的实例时,它是构造函数: public Newton(Polynomial p) { this.f = p; this.fp = this.f.derivative(); 将f设置为p没有问题,但是当 this.fp = this.f.derivative(); 运行时,它将

我为这个措词拙劣的问题道歉——很难仔细解释

我已经写了3个类-一个表示复数,一个表示具有复数系数的多项式,最后一个对所述多项式执行牛顿-拉斐逊算法以找到根的估计

问题是,当我创建Newton类的实例时,它是构造函数:

public Newton(Polynomial p) {
       this.f = p;
       this.fp = this.f.derivative();
将f设置为p没有问题,但是当

this.fp = this.f.derivative();
运行时,它将此.f更改为此.f.导数;也是

这是衍生工具的代码:

public Polynomial derivative() {
        ArrayList<Complex> derivativeCoeff = coeff;
        if (derivativeCoeff.size() == 1){
            return new Polynomial();
        }
        derivativeCoeff.remove(0);
        for (int i = 1; i <= derivativeCoeff.size() ;i++){
            derivativeCoeff.set(i-1,derivativeCoeff.get(i-1).multiply(i));

        }
        Polynomial test = new Polynomial(derivativeCoeff);
        return test;  
    }
当f应该等于p时

请询问是否需要更多信息或代码。我没有在SO上提问的经验,如果能得到任何帮助,我将不胜感激

ArrayList<Complex> derivativeCoeff = coeff;
或者,您可以在获取副本之前删除第一个元素,首先检查是否为空:

ArrayList<Complex> derivativeCoeff = new ArrayList<>(coeff.subList(1, coeff.size()));
或者,您可以在获取副本之前删除第一个元素,首先检查是否为空:

ArrayList<Complex> derivativeCoeff = new ArrayList<>(coeff.subList(1, coeff.size()));
要解决这个问题,只需改变 ArrayList导数系数=系数; 到 ArrayList derivativeCoeff=新的ArrayList系数


之所以会发生这种情况,是因为Java是通过引用调用的,而coeff是对象多项式的一个字段,当您改变多项式对象时,它会改变coeff的状态,并且变化会反映在引用它的任何地方

要解决这个问题,只需更改 ArrayList导数系数=系数; 到 ArrayList derivativeCoeff=新的ArrayList系数


之所以会发生这种情况,是因为Java是通过引用调用的,而coeff是对象多项式的一个字段,当您改变多项式对象时,它会改变coeff的状态,并且变化会反映在引用它的任何地方

不,不是。应该是吗?我们接收骨架,只需填充函数,最初它不是静态的……不,只是我正在检查的东西。不,不是。应该是吗?我们收到了框架,只需要填充函数,最初它不是静态的……不,只是我正在检查的东西。之所以发生这种情况,是因为Java是通过引用调用的。但无论如何,这是不相关的,因为这是一个赋值,而不是一个方法调用。但无论如何,这是无关的,因为这是一个赋值,而不是一个方法调用。
ArrayList<Complex> derivativeCoeff = new ArrayList<>(coeff);
ArrayList<Complex> derivativeCoeff = new ArrayList<>(coeff.subList(1, coeff.size()));
ArrayList<Complex> derivativeCoeff =
    IntStream.rangeClosed(1, coeff.size() - 1)
        .mapToObj(i -> coeff.get(i).multiply(i))
        .collect(Collectors.toCollection(ArrayList::new));
return
    IntStream.rangeClosed(1, coeff.size() - 1)
        .mapToObj(i -> coeff.get(i).multiply(i))
        .collect(
            Collectors.collectingAndThen(
                Collectors.toCollection(ArrayList::new)),
                Polynomial::new));