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

public class Test {
private String id="";
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;
}
private String name="";
public static void main(String[] args) {
Test test=new Test();
test.setId("1");
test.setName("cc");
changeId(test);
System.out.println(test.getId());
}
public static void changeId(Test test)
{
Test tt=new Test();
tt=test;
tt.setId("2");
System.out.println(tt.getId());
}
}

/**我要改变一个对象的值,另一个对象不改变值。
求高手指点

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函数,原理跟上面一样,不过更复杂,涉及到深复制和浅复制问题追问

第一个办法肯定不是好的办法,test的属性有100多个,这样一个一个只是肯定不是最好的。第二种方法的话,我就需要改框架了。

追答

那就实现Cloneable接口,调用clone方法

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-12-26
你这个当然不行了,虽然test和tt是两个对象,但是它们指向了同一块内存地址,只要有一个对象改变了该块内存地址的内容,另外一个对象再次引用的时候当然值就会变了。不知道你这部分代码想要满足什么需求。。。追问

test的属性很多,如果把test的属性一个一个设置给tt肯定不是对好的办法,现在我想获取test的属性给tt,tt在test基础上改变其他属性的值。然后test作为一条记录插入数据库,tt作为一条记录插入数据,需要这样的目的

追答

以前好像记得有个深克隆还有个浅克隆,能解决你的问题,但是我很长时间没有用了,不记得怎么用了,搜搜看吧

第2个回答  2012-12-26
//浅克隆方式
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());
}
}
第3个回答  2012-12-26
把changeId方法改为:
public static void changeId(Test test)
{
Test tt=new Test();
tt.setName(test.getName());
tt.setId("2");
System.out.println(tt.getId());
}追问

额,test属性有100多个,一个一个设置?

第4个回答  2012-12-26
Object.clone()追问

请问还有其他办法么?

追答

在我的知识范畴内没有了。你也可以自己写一个方法复制某个对象的属性和方法,如果是两个变量指向同一个对象实例,你的要求根本不可能达到

追问

嗯,对象只向了一个引用,改变其中一个另一个肯定改变的,所以才请大家帮忙看看有什么办法能解决这个问题

追答

”获取test的属性给tt,tt在test基础上改变其他属性的值。然后test作为一条记录插入数据库,tt作为一条记录插入数据,需要这样的目的“,这个倒是有办法。

1,从数据库读取 test的记录,取出来封装为一个对象,赋值给变量tt。
2,修改tt的主键id,设置为新值,然后在修改其他的属性。
3,将这个对象保存到数据库。

追问

1,从数据库读取 test的记录,取出来封装为一个对象,赋值给变量tt。
2,修改tt的主键id,设置为新值,然后在修改其他的属性。
3,将这个对象保存到数据库。

这个方法不行的,因为test和tt是作为批量sql执行的,他们的加到list中,循环list插入数据的。

追答

那就没有办法了,用clone吧

本回答被提问者采纳
相似回答