Java - 方法中的变量在调用后未被删除
Java - variable in method not erased after call
我真的需要解释我创建的代码的行为。
此处的变量 preyPred:private static double[] preyPredLV(double[] preyPred, double[] a, double[] b, int n)
是否是方法 preyPredLV 的局部变量?
因为,当我在调用该方法期间操作它,然后我再次为不同的 n 调用该方法时,它不会将 preyPredDefault 分配为 preyPred 的值,而是使用它自己的前一次调用的值。当方法 returns 输出值时,它以前的值不应该被丢弃吗?不应该是下次调用时分配的新值吗?有人可以解释一下吗?谢谢
完整代码:
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;
}
}
结果:
n = 1
preyPred[0] = 300.0
preyPred[1] = 20.0
After 1 generations: Hares = 270.00000000000006 and Lynx = 19.92
n = 2
preyPred[0] = 270.00000000000006
preyPred[1] = 19.92
After 2 generations: Hares = 219.31183648512007 and Lynx = 19.726535847029762
您正在将 preyPredDefault
数组的引用传递给您的 preyPredLV
方法,并且您的方法通过您传递的引用更新此数组。因此,您的方法修改了该数组的内容。
如果您不想 preyPredLV
更新该数组,您可以将数组的副本传递给它。
double[] result = preyPredLV(Arrays.copyOf(preyPredDefault,preyPredDefault.length), a, b, n);
Java 中的数组未作为副本传递。它们作为数组的引用传递,然后在调用者和方法之间共享。
因此,如果您从方法中更新数组,这是就地更新,并且更改将对引用该数组的任何其他人可见。
如果您想避免这种情况,请制作一个 "defensive copy"(使用 Arrays.copyOf)并仅对其进行更改。
我真的需要解释我创建的代码的行为。
此处的变量 preyPred:private static double[] preyPredLV(double[] preyPred, double[] a, double[] b, int n)
是否是方法 preyPredLV 的局部变量?
因为,当我在调用该方法期间操作它,然后我再次为不同的 n 调用该方法时,它不会将 preyPredDefault 分配为 preyPred 的值,而是使用它自己的前一次调用的值。当方法 returns 输出值时,它以前的值不应该被丢弃吗?不应该是下次调用时分配的新值吗?有人可以解释一下吗?谢谢
完整代码:
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;
}
}
结果:
n = 1
preyPred[0] = 300.0
preyPred[1] = 20.0
After 1 generations: Hares = 270.00000000000006 and Lynx = 19.92
n = 2
preyPred[0] = 270.00000000000006
preyPred[1] = 19.92
After 2 generations: Hares = 219.31183648512007 and Lynx = 19.726535847029762
您正在将 preyPredDefault
数组的引用传递给您的 preyPredLV
方法,并且您的方法通过您传递的引用更新此数组。因此,您的方法修改了该数组的内容。
如果您不想 preyPredLV
更新该数组,您可以将数组的副本传递给它。
double[] result = preyPredLV(Arrays.copyOf(preyPredDefault,preyPredDefault.length), a, b, n);
Java 中的数组未作为副本传递。它们作为数组的引用传递,然后在调用者和方法之间共享。
因此,如果您从方法中更新数组,这是就地更新,并且更改将对引用该数组的任何其他人可见。
如果您想避免这种情况,请制作一个 "defensive copy"(使用 Arrays.copyOf)并仅对其进行更改。