【问题标题】:Java - variable in method not erased after callJava - 调用后未删除方法中的变量
【发布时间】:2015-08-06 23:07:31
【问题描述】:

我真的需要解释我创建的代码的行为。 这里的变量 preyPred:private static double[] preyPredLV(double[] preyPred, double[] a, double[] 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;
        }
    }

结果:

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

【问题讨论】:

    标签: java variables methods local


    【解决方案1】:

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

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

    如果您想避免这种情况,请制作“防御性副本”(使用 Arrays.copyOf)并仅对其进行更改。

    【讨论】:

      【解决方案2】:

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

      如果您不希望 preyPredLV 更新该数组,您可以将数组的副本传递给它。

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

      【讨论】:

        猜你喜欢
        • 2012-07-05
        • 1970-01-01
        • 2010-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多