数组并通过引用传递

时间:2012-04-22 20:31:02

标签: java pass-by-reference

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

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]);
    }
}

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

基本上,因为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 :(得分:-1)

我相信Java使用pass-by-value参数传递语义。通过在PSVM()中声明float[] arr2,其范围仅限于那里,如果将数组传递给另一个函数,它将按值传递。

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