Java-调用后未擦除方法中的变量

Java-调用后未擦除方法中的变量,java,variables,methods,local,Java,Variables,Methods,Local,我真的需要解释我创建的代码的行为。 变量preyPred here:私有静态双精度[]preyPredLV(双精度[]preyPred,双精度[]a,双精度[]b,int n)是否为方法preyPredLV的本地变量 因为,当我在调用该方法的过程中对其进行操作,然后针对不同的n再次调用该方法时,它不会将preyPredDefault赋值为preyPred的值,但它使用以前调用中自己的值。当方法返回输出值时,不应该丢弃它以前的值,而不应该是在下一次调用期间分配的新值吗?有人能解释一下吗?多谢各位

我真的需要解释我创建的代码的行为。 变量preyPred here:
私有静态双精度[]preyPredLV(双精度[]preyPred,双精度[]a,双精度[]b,int n)
是否为方法preyPredLV的本地变量

因为,当我在调用该方法的过程中对其进行操作,然后针对不同的n再次调用该方法时,它不会将preyPredDefault赋值为preyPred的值,但它使用以前调用中自己的值。当方法返回输出值时,不应该丢弃它以前的值,而不应该是在下一次调用期间分配的新值吗?有人能解释一下吗?多谢各位

全部代码:

public class Main {

        public static void main(String[] args) {
            double[] preyPredDefault = {300, 20};
            double[] a = {0.1, 0.01};
            double[] b = {0.01, 0.00002};

            int n = 1;
            double[] result = preyPredLV(preyPredDefault, a, b, n);
            System.out.println("After "+n+" generations: Hares = "+result[0]+" and Lynx = "+result[1]);


            n = 2;
            result = preyPredLV(preyPredDefault, a, b, n);
            System.out.println("After "+n+" generations: Hares = "+result[0]+" and Lynx = "+result[1]);

        }

        private static double[] preyPredLV(double[] preyPred, double[] a, double[] b, int n) {
            double[] preyPredOld = new double[2];
            System.out.println("n = "+n);
            System.out.println("preyPred[0] = "+preyPred[0]);
            System.out.println("preyPred[1] = "+preyPred[1]);
            for(int iteration = 0; iteration < n; iteration++){
                preyPredOld[0] = preyPred[0];
                preyPredOld[1] = preyPred[1];
                preyPred[0] = preyPredOld[0] * (1 + a[0] - a[1]*preyPredOld[1]);
                preyPred[1] = preyPredOld[1] * (1 - b[0] + b[1]*preyPredOld[0]);
            }
            return preyPred;
        }
    }

您正在将
preyPredDefault
数组的引用传递给
preyPredLV
方法,并且您的方法通过您传递的引用更新此数组。因此,您的方法会修改该数组的内容

如果不希望
preyPredLV
更新该数组,可以向其传递该数组的副本

double[] result = preyPredLV(Arrays.copyOf(preyPredDefault,preyPredDefault.length), a, b, n);

Java中的数组不作为副本传递。它们作为对数组的引用传递,然后在调用方和方法之间共享

因此,如果您从方法中更新数组,这是一个就地更新,任何其他对该数组有引用的人都可以看到更改

如果要避免这种情况,请创建一个“防御副本”(使用Arrays.copyOf)并仅对其进行更改

double[] result = preyPredLV(Arrays.copyOf(preyPredDefault,preyPredDefault.length), a, b, n);