java 声明两个对象,指向一个引用,然后一个对象改变属性,另一个对象的属性也变了,直接上代码

2024-12-04 11:25:54
推荐回答(5个)
回答(1):

Test tt=new Test();
tt=test;
tt.setId("2");
注意Test tt这里的tt只是一个对象的引用,就好像C中的指针一样
tt=test;这句话是把test引用指向的对象的地址交给tt,即tt跟test指向了同一个对象
要达到你的目的,可以采用以下方法:
第一,Test tt=new Test();后把test的每个属性的值赋给tt
第二,就是克隆了,clone函数,原理跟上面一样,不过更复杂,涉及到深复制和浅复制问题

回答(2):

你这个当然不行了,虽然test和tt是两个对象,但是它们指向了同一块内存地址,只要有一个对象改变了该块内存地址的内容,另外一个对象再次引用的时候当然值就会变了。不知道你这部分代码想要满足什么需求。。。

回答(3):

//浅克隆方式
public class Test implements Cloneable{
private static final long serialVersionUID = 2213587695985595126L;
private String id = "";
private String name = "";

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public static void changeId(Test test) {
Test tt = null;
try {
tt = (Test) test.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
tt.setId("2");
System.out.println(tt.getId());
}

public static void main(String[] args) {
Test test = new Test();
test.setId("1");
test.setName("cc");
changeId(test);
System.out.println(test.getId());
}
}

回答(4):

把changeId方法改为:
public static void changeId(Test test)
{
Test tt=new Test();
tt.setName(test.getName());
tt.setId("2");
System.out.println(tt.getId());
}

回答(5):

Object.clone()