-2

在下面的代码中,为什么在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]);
    }
}
4

3 回答 3

2

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

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

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

于 2012-04-22T20:35:11.307 回答
2

基本上,因为array2is not 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;

有关更多详细信息,请参阅此答案

于 2012-04-22T20:42:07.943 回答
-1

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

另一方面,如果您在PSVM()float[] arr2 之外声明(但在类定义内),那么它的范围将在类内是全局的。但是,我仍然认为您的代码不会起作用,因为 IIRC,您不能像您的代码在method2().

于 2012-04-22T20:41:37.843 回答