2014-10-01 69 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