我正在将对象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
答案 0 :(得分:4)
因为=
只是复制引用(指针)而不是对象,所以你引用的真实对象是相同的。我建议你按照here的说明使用复制构造函数。
您可以阅读更详尽的解释here(关于ArrayList
,但您可以推断到任何其他对象)。
从答案中摘录:
b = a
请记住,这些行不会将整个列表a复制到b,而只是复制 将引用复制到列表中。现在a和b都参考(点) 到同一个清单。所以如果你使用a.add()或b.add()并不重要, 你将修改同一个List。
为帮助您理解上述内容,请查看下图
左图对应于您Object[][] tt=new Object[2][2];
的时间。您可以看到在内存中创建了一个Object[2][2]
实例,即圆圈,并为其指定了一个名为tt
的指针(引用),即矩形。
右图对应于您ttt = tt
的时间。这意味着:&#34;使ttt指向与tt&#34; 相同的对象。它不会为您复制任何内容。所以现在tt
和ttt
指向(引用)内存中的相同对象实例。因此,如果您使用tt
或ttt
,则将修改相同的对象实例。
我希望这能澄清你正在做的事情。至于修复它,你应该按照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?中的技术。