Java复制对象并更新复制的对象

时间:2014-12-02 15:28:33

标签: java object copy

我正在将对象tt复制到ttt,我只想改变ttt但是当我更新ttt dunno为什么它更新我的tt沿着????它的makechange()函数出了问题吗?

这是主要课程:

package test;

public class Test {

public static void main(String[] args) {
    Solution sol;
    sol= new Solution();

    sol.add();
    sol.copy();
    //this makechange function only update ttt only!!
    sol.makechange();
    sol.disOld();
    System.out.println("===============");
    sol.disNew();

}
}

这是新课程:

package test;

import java.util.ArrayList;
import java.util.List;

public class Solution {
Object[][] tt=new Object[2][2];
Object[][] ttt=new Object[2][2];
List l = new ArrayList<>();

public void add(){
    l.add(100);
    tt[0][0]=l;
    l = new ArrayList<>();
    l.add(123);
    tt[0][1]=l;
    l = new ArrayList<>();
}

public void disOld(){
    for(int i=0; i<tt.length; i++){
        for(int j=0; j<tt[i].length; j++){
            System.out.println(tt[i][j]);
        }
    }
}

public void copy(){
    ttt=tt;
}

public void makechange(){
    l.add(99);
    ttt[1][0]=l;
}

public void disNew(){
    for(int i=0; i<ttt.length; i++){
        for(int j=0; j<ttt[i].length; j++){
            System.out.println(ttt[i][j]);
        }
    }
}

}

这是我的输出:

[100]
[123]
[99]
null
===============
[100]
[123]
[99]
null

这是我的预期输出应该是这样的:

[100]
[123]
null
null
===============
[100]
[123]
[99]
null

3 个答案:

答案 0 :(得分:4)

因为=只是复制引用(指针)而不是对象,所以你引用的真实对象是相同的。我建议你按照here的说明使用复制构造函数。

您可以阅读更详尽的解释here(关于ArrayList,但您可以推断到任何其他对象)。

从答案中摘录:

  

b = a

     

请记住,这些行不会将整个列表a复制到b,而只是复制   将引用复制到列表中。现在a和b都参考(点)   到同一个清单。所以如果你使用a.add()或b.add()并不重要,   你将修改同一个List。


为帮助您理解上述内容,请查看下图

enter image description here

左图对应于您Object[][] tt=new Object[2][2];的时间。您可以看到在内存中创建了一个Object[2][2]实例,即圆圈,并为其指定了一个名为tt的指针(引用),即矩形。

右图对应于您ttt = tt的时间。这意味着:&#34;使ttt指向与tt&#34; 相同的对象。它不会为您复制任何内容。所以现在ttttt指向(引用)内存中的相同对象实例。因此,如果您使用ttttt,则将修改相同的对象实例。

我希望这能澄清你正在做的事情。至于修复它,你应该按照Duncan的答案中的说明逐一复制数组的每个元素。更一般地说,您应该使用复制构造函数来复制对象as I linked above

答案 1 :(得分:2)

=只是使两个引用都指向同一个对象。如果你想制作一个副本(通常),那么看一下Java中的Cloninng(不推荐)或者考虑一个Copy-Constructor。

要解决您的问题,请将复制方法更改为以下内容:

public void copy(){
    for(int i=0; i<tt.length; i++)
        for(int j=0; j<tt[i].length; j++)
             ttt[i][j]= tt[i][j];
}

答案 2 :(得分:1)

这是你如何复制数组:

public void copy(){
    ttt=tt;  // booo, hisss, etc.
}

执行此方法后,ttt指向tt完全相同的数组。通过两个变量可以看到对该数组所做的更改。

您需要正确复制数组,例如使用How do I copy a 2 Dimensional array in Java?中的技术。