通过引用传递与变量与数组元素中的值

Pass by reference versus value in variable versus array element

我知道这个问题显然有很多重复,比如 here and here

不过我的问题不一样。

考虑以下示例:

public class MyClass {
    public static void test(int a, int b) {
        System.out.println("In test() at start: "+a+" "+b);
        int temp=a;
        a=b;
        b=temp;
        System.out.println("In test() at end: "+a+" "+b);
    }

    public static void main(String args[]) {
        int a=1, b=2;
        System.out.println("a: "+a+" b: "+b);

        test(a, b);
        System.out.println("a: "+a+" b: "+b);
    }
}
上述代码段的

The output that I get 是:

a: 1 b: 2
In test() at start: 1 2
In test() at end: 2 1
a: 1 b: 2

这表明我调用test()ab在main()中的原始值没有被交换,从而暗示(如果我理解正确的话)它是通过值传递的。

现在,考虑以下代码片段:

public class MyClass {
    public static void test(int[] arr) {
        System.out.println(arr[2]);
        arr[2]=20;
        System.out.println(arr[2]);
    }

    public static void main(String args[]) {
        int[] arr={0,1,2,3,4,5};
        System.out.println(arr[2]);

        test(arr);
        System.out.println(arr[2]);
    }
}
此代码段的

The output that I get 是:

2
2
20
20

这表明 arr[2] 处的值在 main() 中的原始数组中发生了变化,从而表示(如果我理解正确的话)数组 是通过引用传递的

有人能指出这是怎么回事吗?为什么它表现出不同的行为?

谢谢!

我认为您只是对数组部分感到困惑。

java中的数组是一个特殊的object,它包含对其他对象的引用。 你可以很好地改变那些“child”对象的值,就像任何对象一样。

记住我为了避免混淆而保留的这条经验法则:

It doesn't matter what you do directly with the object but what you do inside it

这意味着如果您在任何子对象(或您的情况下的数组项)内部进行一些更改,您会在调用者中看到它的副作用

原始数据类型变量将按值传递。 对象数据类型变量将通过引用传递。 Array 是 Object 数据类型,因此它将通过引用传递。