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