反映实际对象的Java本地对象副本

反映实际对象的Java本地对象副本,java,object,pass-by-value,Java,Object,Pass By Value,有人能解释为什么我的预期结果和实际结果不同吗 我已经在不同的网站上浏览了一些其他的帖子(包括stackoverflow),但答案并不切题 public class Test { List<String> str= new ArrayList<String>(); public void addString(String a) { str.add(a); } public void takeALoca

有人能解释为什么我的预期结果和实际结果不同吗

我已经在不同的网站上浏览了一些其他的帖子(包括stackoverflow),但答案并不切题

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

尽管你称之为
.Copy..
,但我认为你误解了你正在复制的内容。存储在引用类型变量中的值是对对象的引用。所以你要复制的是参考值,而不是对象

您在应用程序中创建了一个
Test
类型的实例,即
main
方法中的实例

Test c= new Test();

然后传递存储在
c
中的引用值。该值的其他用法仍然引用同一对象。

您是否理解所有这些变量都是引用?您能否清楚地解释一下您的说法。“因此,您复制的是引用值,而不是对象”。@madhureddy480当您执行
object o=new object()
时,存储在
o
中的实际上是创建的实例的地址。在方法调用中将
o
in用作参数时,Java复制其值(地址值)并将其绑定到相应的方法参数。
Test c= new Test();