示例代码
public class test {
public test(){
runTest();
}
private void runTest(){
//method 1
int[] A = {1,2,3,4};
int[] B = new int[A.length];
for (int i = 0; i < A.length; i++){
B[i] = A[i]+1;
}
for (int i: A){
System.out.println(" A: " + i);
}
System.out.println("----------");
for (int i: B){
System.out.println(" B: " + i);
}
System.out.println("----------");
//method 2
int[] C = {1,2,3,4};
int[] D = C;
for (int i = 0; i <D.length; i++){
D[i]++;
}
for (int i: C){
System.out.println(" C: " + i);
}
System.out.println("----------");
for (int i: D){
System.out.println(" D: " + i);
}
System.out.println("----------");
}
public static void main(String[] args){
new test();
}
}
问题
我在我的一个methods
中遇到了一个问题,发现这个问题是创建临时object
改变了原始的,这是我不希望发生的。我只是想知道为什么会发生这种情况,我的印象是设置一个object
等于另一个只指向当前位置/状态,而不是任何未来的更新。
换句话说,我想知道为什么我对int A
和int B
做了我做的,而不是对int C
和int D
做了我做的。
为了使它更简单,上面两个方法的区别是什么?我要尝试一下,当int C
或int D
被调用时,JVM
调用相同的reference
,因为我没有像int A
int B
那样创建一个新对象。
不同之处在于,对于A和B, B
是数组的副本,并且是与A
完全独立的对象。对于C和D, D
是指向与C
相同对象的另一个数组引用。D
继续引用不仅是"当前位置/状态",但相同的对象,直到它被重新分配或它超出范围。无论您对D
所引用的对象做了什么,通过C
也将可见,因为它是同一个对象。