gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:24:42 24 4
gpt4 key购买 nike

我正在将对象 tt 复制到 ttt,并且我只想对 ttt 进行更改,但是当我更新 ttt 时,不知道为什么它会更新我的 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();

}
}

这是新类(class):

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

最佳答案

因为 = 只是复制引用(指针),而不是对象,所以您引用的真实对象是相同的。我建议您使用复制构造函数,如下所述 here .

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

摘自该答案:

b = a

Keep in mind this lines DOES NOT copy the whole list a to b, but only copies the reference to the list. Now both a and b reference (point) to the same List. So it doesn't matter if you use a.add() or b.add(), you'll be modifying the same List.

<小时/>

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

enter image description here

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

右图对应于您执行ttt = tt时的情况。这意味着:“让 ttt 指向与 tt 相同的对象”。它不会为您复制任何内容。所以现在 ttttt 都指向(引用)内存中的同一个对象实例。因此,如果您使用 ttttt,您将修改同一个对象实例。

我希望这能澄清你在做什么。至于修复它,您应该按照邓肯的答案中的解释,一一复制数组的每个元素。更一般地说,您应该使用复制构造函数来复制对象 as I linked above .

关于Java复制对象并更新复制的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27253003/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com