【问题标题】:Java local object copy reflecting actual object [duplicate]反映实际对象的Java本地对象副本[重复]
【发布时间】:2014-11-26 21:43:30
【问题描述】:

谁能解释为什么我的预期和实际结果不同。

我已经浏览过各个网站(包括 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

【问题讨论】:

  • 你明白所有这些变量都是引用吗?

标签: java object pass-by-value


【解决方案1】:

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

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

Test c= new Test();

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

【讨论】:

  • 你能解释清楚吗,你的陈述。 “所以你要复制的是参考值,而不是对象”。
  • @madhureddy480 当您执行Object o = new Object() 时,o 中存储的实际上是创建的实例的地址。当您在方法调用中使用o in 作为参数时,Java 会复制其值(地址的值)并将其绑定到相应的方法参数。
猜你喜欢
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 2017-10-09
  • 2011-09-28
相关资源
最近更新 更多