输出不一致的代码段

时间:2016-09-09 05:09:29

标签: java deep-copy

我正在尝试以下代码,我想在其中创建主对象的深层副本,并在新创建的对象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)
    }
}

2 个答案:

答案 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);

在仅复制数据而非对象引用后,您可以尝试更改主对象不会更改的地址,也可以使用克隆方法

例如:How to make a deep copy of Java ArrayList

答案 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的地址而不是传递地址。