2016-12-25 96 views
3

我在閱讀有關複製參考數組的信息。複製參考數組

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)); 

都指向相同的元素,但改變元件改變第二種情況第2個數組沒有在第一case.Can有人能解釋我爲什麼不改變它第二陣列中的第一種情況下這裏的陣列。

回答

2
obj1[0] = new Integer(5); 

在這裏,你被分配給一個新的對象的陣列中的一個的所述第一索引的基準,所以其它陣列的第一索引保持參照不同的對象,並不會受到影響。

((StringBuffer) obj1[1]).append('s'); 

這裏你正在改變由obj1[1]引用的對象,這是obj2[1]引用的同一對象的狀態。因此兩個陣列都受到影響。

1

在這第一種情況下,您正在更改同一個對象(通過調用其上的append方法)。第二,你用一個不同的參考替換一個參考。原始數組仍然指向原始參考,因此保持不變。

1

這裏

obj1[0] = new Integer(5); 

你改變由OBJ1的第一個元素所引用的對象。
更改引用引用的對象不會更改引用此對象的其他引用。 因此,現在兩個數組的第一個元素不再引用同一個對象。

這裏:

((StringBuffer) obj1[1]).append('s'); 

兩個數組引用總是相同的對象的第一個元素。 您已更改引用的對象的內容。所以這個對象的所有引用都看到了這個變化。