我正在测试此代码。
class something {
public static void main(String[] args) {
int[] a = {1, 2, 3, 4, 5};
sth(a);
System.out.println(a);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
public static void sth(int[] a){
int[] b = new int[a.length];
for (int i = 0; i < a.length; i++) {
b[i] = 0;
}
a = b;
System.out.println(a);
System.out.println(b);
}
}
预期产出:
SAME MEMORY VALUE
0 0 0 0 0
我的目标
[I@46d20791
[I@46d20791
[I@2c7f1f63
1 2 3 4 5
然而改变行
b[i] = 0;
到
a[i] = 0;
反映了对
的更改[I@46d20791
[I@46d20791
[I@2c7f1f63
0 0 0 0 0
帮助我了解那里发生了什么?
答案 0 :(得分:0)
在sth
执行a = b
时,您只是将本地参考a
(参数)更改为指向b
,您不会更改主方法变量a
的参考。
在您调用System.out.print(a[i] + " ");
的主方法中,它引用主方法变量a
(范围内唯一的a
),该方法保持不变。
当您将代码更改为a[i] = 0;
时,参数的本地引用a
仍然引用主方法变量a
,因此代码按预期工作。
在不更改代码的情况下获得所需行为的一种方法是更改方法以返回您希望方法方法a
使用的引用:
// in the method method
a = sth(a);
...
public static int[] sth(int[] a){
...
return a; // if keeping local_a_reference=b;
}