【问题标题】:Arrays and passing by reference数组和引用传递
【发布时间】:2012-04-22 20:31:02
【问题描述】:

在下面的代码中,为什么在method2中改变了原始数组,arr2[0]仍然等于1.5?忽略其他数组和变量。

public class Problem3
{
    public static int method1(int[] array)
    {
        array[0] += 10;
        return array[0];
    }

    public static int method2(int aNum, String aStr,
        int[] array1, float[] array2, int[] array3)
    {
        float[] fNums = {1.5F, 2.5F};
        array2 = fNums;

        return 10 + method1(array3);
    }

    public static void main(String[] args)
    {
        int num = 1000;
        String aStr = "Hello!";
        int[] arr1 = {1, 2, 3};
        float[] arr2 = {0.5F, 1.5F};
        int[] arr3 = {5, 6, 7};
        int retNum = method2(num, aStr, arr1, arr2, arr3);

        System.out.println(arr2[0]);
    }
}

【问题讨论】:

  • 基本上我认为答案是 1.5,但解决方案是 0.5,我想知道是否有人可以解释一下?
  • 看到这个答案:stackoverflow.com/a/9404727/597657
  • Java 中没有引用传递

标签: java pass-by-reference


【解决方案1】:

基本上,因为array2 不是arr2,但它们在调用method2 时引用内存中的同一个数组:

method2(num, aStr, arr1, arr2, arr3);
public static int method2(int aNum, String aStr, int[] array1, float[] array2, int[] array3)

然后,您使array2 引用fNums 所引用的新数组,并且您没有更改arr2 引用的数组:

float[] fNums = {1.5F, 2.5F};
array2 = fNums;

查看answer了解更多详情。

【讨论】:

    【解决方案2】:

    因为你改变了对整个数组的引用,并没有修改传入的数组。

    当您调用 method2 时,参数指向外部创建的数组。在 method2 中,您使参数指向一个新数组。这不会改变调用方法中的变量指向的数组,仍然指向原始数组。

    如果您只是修改了在方法 2 中给出的现有数组,那么您会在调用方法中看到这些更改。

    【讨论】:

      【解决方案3】:

      我相信 Java 使用 pass-by-value 参数传递语义。通过在 PSVM() 中声明 float[] arr2,它的作用域被限制在了那里,如果你将数组传递给另一个函数,它会按值传递。

      另一方面,如果您在 PSVM() 之外声明了 float[] arr2(但在类定义内),那么它的作用域将在类内是全局的。但是,我仍然认为您的代码不会起作用,因为 IIRC,您不能像 method2() 中的代码那样通过单个赋值来分配整个数组的值。

      【讨论】:

        猜你喜欢
        • 2012-05-06
        • 1970-01-01
        • 2012-02-20
        • 1970-01-01
        • 1970-01-01
        • 2011-08-09
        • 2016-06-06
        相关资源
        最近更新 更多