通过引用传递与变量与数组元素中的值
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);
}
}
上述代码段的
a: 1 b: 2
In test() at start: 1 2
In test() at end: 2 1
a: 1 b: 2
这表明我调用test()
时a
和b
在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]);
}
}
此代码段的
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 数据类型,因此它将通过引用传递。
我知道这个问题显然有很多重复,比如 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);
}
}
上述代码段的
a: 1 b: 2
In test() at start: 1 2
In test() at end: 2 1
a: 1 b: 2
这表明我调用test()
时a
和b
在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]);
}
}
此代码段的
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 数据类型,因此它将通过引用传递。