我正在阅读有关复制引用数组的内容。
Object[] obj1 = {new Integer(11),
new StringBuffer("foobar"),
new Double(12.95)};
Object[] obj2 = new Object[obj1.length];
for(int i = 0; i < obj1.length; i ++)
obj2[i] = obj1[i];
//this change to obj1 does NOT effect obj2.
obj1[0] = new Integer(5);
System.out.println(Arrays.toString(obj1));
System.out.println(Arrays.toString(obj2));
System.out.println();
//this change to obj1 DOES effect obj2
((StringBuffer) obj1[1]).append('s');
System.out.println(Arrays.toString(obj1));
System.out.println(Arrays.toString(obj2));
两个数组都指向相同的元素,但是在第二种情况下改变第二个数组不是第一种情况。有人解释我为什么不在这里改变第二个数组。
答案 0 :(得分:2)
obj1[0] = new Integer(5);
在这里,您将新对象的引用分配给其中一个数组的第一个索引,因此另一个数组的第一个索引始终引用不同的对象而不受影响。
((StringBuffer) obj1[1]).append('s');
在这里,您要更改obj1[1]
引用的对象的状态,该对象与obj2[1]
引用的对象相同。因此,两个阵列都会受到影响。
答案 1 :(得分:1)
在第一种情况下,您正在更改同一个对象(通过调用append
方法)。在第二个中,您将使用不同的引用替换引用。原始数组仍然指向原始引用,因此保持不变。
答案 2 :(得分:1)
这里
obj1[0] = new Integer(5);
你改变了obj1的第一个元素所引用的对象 更改引用引用的对象不会将更改应用于引用此对象的其他引用。 所以,现在两个数组的第一个元素不再引用同一个对象。
这里:
((StringBuffer) obj1[1]).append('s');
两个数组的第一个元素始终引用相同的对象。 您已更改引用的对象的内容。因此,关于此对象的所有引用都会看到更改。