我有这段代码:
int[] copyFrom = {1,2,3,4,5,6,7,8,9};
int[] copyTo = new int[9];
copyTo = copyFrom;
copyFrom = new int[9];
System.out.println(copyTo[0]);
我得到的值是“1”..
据我所知copyTo = copyFrom只复制对数组的引用。 那么为什么当我初始化copyFrom时,copyTo仍然引用旧内存?
道歉,如果这是愚蠢或重复,我是新手用户。
答案 0 :(得分:4)
以下是发生的事情:
int[] copyFrom = {1,2,3,4,5,6,7,8,9};
int[] copyTo = new int[9];
可视化为
copyFrom ------------> [1,2,3,4,5,6,7,8,9]
copyTo ------------> [0,0,0,0,0,0,0,0,0]
现在copyTo = copyFrom;
使copyTo
保持与copyFrom
相同的值,因此新情况如下
copyFrom ---------+
|
+--> [1,2,3,4,5,6,7,8,9]
|
copyTo ---------+
如你所见,仍然有两个引用,但它们只保持相同的值,因此更改其中一个不会影响其他(我正在谈论更改引用的值 - ref = new Value();
- 不是对象的状态他们持有ref.setParam(foo);
)
然后,您更改copyFrom
引用以保留新数组copyFrom = new int[9];
,现在您已
copyFrom ------------> [0,0,0,0,0,0,0,0,0]
copyTo ------------> [1,2,3,4,5,6,7,8,9]
这就是System.out.println(copyTo[0]);
打印1
。
答案 1 :(得分:1)
让我们这样说:
int[] copyFrom = {1,2,3,4,5,6,7,8,9}; //cpFrom holds memory addr 123 to the array
int[] copyTo = new int[9]; //cpTo holds addr 456 to a new array
copyTo = copyFrom; //now cpTo and cpFrom hold same addr 123
copyFrom = new int[9]; //now cpFrom holds addr 789(new arr), but cpTo still holds 123
现在你看到了
答案 2 :(得分:0)
1- copyFrom -> array1 = {1,2..9}
2- copyTo -> array2 = new int[]
3- copyTo -> array1 (array2 is lost)
3- copyFrom -> array3 = new int[]
所以最后,copyTo指向第一个数组,因此答案。
答案 3 :(得分:0)
将引用复制到包含数据{1,2,3,4,5,6,7,8,9}
的内存位置。
然后,当您初始化copyFrom时,它引用一个新的内存位置,而copyTo仍然引用第一个内存位置。
答案 4 :(得分:0)
当你做copyTo = copyFrom;在第3行。 copyTo指向第1行的数组,即copyFrom。在下一行中,您将copyFrom指向一个新的array.copyTo数组仍然指向第1行的数组,当您打印copyTo [0]时,它会选择它指向的数组的第一个元素。因此答案1。
希望它澄清。