我正在尝试以下代码,我想在其中创建主对象的深层副本,并在新创建的对象person1
中进行更改。但是变化反映在对象中。因此,结果主对象应保持相同,并且新创建的对象state
应为null
。并且还使用synchronized
块。
class Person {
public void persist() {
print(this.toString()); //print whole object
Person person1 = new Person ();
person1.setName(this.getName());
person1.setAddress(this.getAddress());
for(Address address : person1.getAddress()) {
address.setState(null);
}
print(person1.toString()); //printobject with state as null
print(this.toString()); // print object with state as null(ERROR)
}
}
答案 0 :(得分:0)
您在person1.setAddress(this.getAddress())中提供的内容;是您需要复制数据时需要复制数据的新对象中的当前地址的地址
例如
Person p1=new Person();
List<Address> addList;
for(Address add:this.getAddress())
{
addList.add(new Address(add.getstreet,add.getHome,null/*this is state*/));
}
p1.setAddress(addList);
在仅复制数据而非对象引用后,您可以尝试更改主对象不会更改的地址,也可以使用克隆方法
答案 1 :(得分:0)
由于您尚未发布完整代码,我假设方法签名为void Person.setName(Address add)
和Address Person.getName()
我怀疑当你通过传递this
Person的地址引用来调用setName方法时,你的setName方法的实现只是将传递的地址的引用复制到Person1的地址。
如果是深拷贝你不应该像现在一样复制引用this
Person和Person1指向同一个地址,对Address的任何更改现在都会反映在Person对象中。
你可以先通过cloning来避免这种情况。在setName
的实现中寻址对象(比如adrs_new)并将此adrs_new分配给Person1的地址而不是传递地址。