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

时间:2014-10-01 22:27:17

标签: 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 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);        
    }
}

输出:

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

1 个答案:

答案 0 :(得分:0)

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

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

中的实例
Test c= new Test();

然后传递了c中存储的引用值。该值的每次使用仍然引用同一个对象。