2014-10-01 67 views
0

有人可以解釋爲什麼我的預期結果和實際結果有所不同。反映實際對象的Java本地對象副本

我已經在各種網站(包括計算器)中經歷了一些其他帖子,但答案並未切入點。

public class Test 
{ 
    List<String> str= new ArrayList<String>();  

    public void addString(String a) 
    { 
     str.add(a); 
    } 

    public void takeALocalCopy(Test c) 
    { 
     Test localCopy1= c; 
     localCopy1.addString("Two"); 

     //Expecting output -->One,Two -->Success. 
     System.out.println(localCopy1.toString()); 

     Test localCopy2= c; 
     localCopy2.addString("Three"); 

     //Expecting -->One,Three but actual is One,Two,Three.  
     System.out.println(localCopy2.toString()); 
    } 

    @Override 
    public String toString() { 
     return "Test [str=" + str + "]"; 
    }  

    public static void main(String[] args) 
    { 
     Test c= new Test(); 
     c.addString("One"); 
     c.takeALocalCopy(c);   
    } 
} 

OUTPUT:

Test [str=[One, Two]] 
Test [str=[One, Two, Three]] //Expected One, Two 
+1

你是否明白所有這些變量都是**引用**? – 2014-10-01 22:29:01

回答

0

雖然你把它叫做..Copy..,我想你誤會你要複印的內容。存儲在引用類型變量中的值是對對象的引用。所以你所複製的是參考值,而不是對象。

您在應用程序中main方法創建Test類型的單個實例,一個

Test c= new Test(); 

你身邊,然後存儲在c基準的值傳遞。該值的每個其他用法仍然引用相同的對象。

+0

你能否清楚地解釋我,你的陳述。 「所以你所複製的是參考價值,而不是對象」。 – 2014-10-01 22:35:57

+0

@ madhureddy480當您執行Object o = new Object()時,存儲在o中的實際內容就是創建實例的地址。當在方法調用中使用'o'作爲參數時,Java會複製其值(地址值)並將其綁定到相應的方法參數。 – 2014-10-01 22:37:49