Object类中的clone()方法是浅拷贝

2020-01-11  本文已影响0人  fanderboy

深拷贝和浅拷贝的概念:
官方说法:当一个对象被拷贝时,拷贝得到的对象内部的引用对象和原对象内部的引用对象地址相等,这是浅拷贝。反之,是深拷贝。
说人话:当对象中含有可变的引用类型属性时,在复制得到的新对象对该引用类型属性内容进行修改,原始对象响应的属性内容也会发生变化,这就是"浅拷贝"的现象。
浅拷贝案例:

@Getter
@Setter
@ToString
public class Person implements Cloneable {

    private String name;
    private Address address;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
@Getter
@Setter
@ToString
public class Address {
    private String province;
    private String street;
}

测试:

  public static void main(String[] args) throws CloneNotSupportedException {
        Person person = new Person();
        person.setName("小明");
        Address address = new Address();
        address.setProvince("河南");
        address.setStreet("中州大道");
        person.setAddress(address);
        Person clonePerson = (Person) person.clone();

        System.out.println(person);
        System.out.println(clonePerson);

        clonePerson.setName("小香");
        address = clonePerson.getAddress();
        address.setStreet("王城大道");

        System.out.println(person);
        System.out.println(clonePerson);
    }

运行结果:

Person(name=小明, address=Address(province=河南, street=中州大道))
Person(name=小明, address=Address(province=河南, street=中州大道))
Person(name=小明, address=Address(province=河南, street=王城大道))
Person(name=小香, address=Address(province=河南, street=王城大道))
上一篇 下一篇

猜你喜欢

热点阅读