JAVA 中对象的赋值是复制对象的引用,即复制引用
public static void main(String[] args) { User user = new User(1,"asds",18); User user1 = user; System.out.println(user); System.out.println(user1); }
JAVA 中复制对象(克隆副本,互不影响)
使用 clone() 方法要求被克隆对象实现 Cloneable 接口,修改覆盖的 clone() 方法的修饰符为 public
public class User implements Cloneable { private Integer id; private String name; private Integer age; @Override public Object clone() throws CloneNotSupportedException { return super.clone(); }
再测试
public static void main(String[] args) throws CloneNotSupportedException { User user = new User(1,"asds",18); User user1 = (User) user.clone(); System.out.println(user); System.out.println(user1); }
浅拷贝
public class Address { private String address;
public class User implements Cloneable { private Integer id; private String name; private Integer age; private Address address; @Override public Object clone() throws CloneNotSupportedException { return super.clone(); }
测试
public static void main(String[] args) throws CloneNotSupportedException { Address address = new Address("wuhan"); User user = new User(1,"asds",18,address); User user1 = (User) user.clone(); // System.identityHashCode() 获取对象唯一标识,若对象不重写 hashCode() 则值和 Object.hashCode() 一样 System.out.println(System.identityHashCode(user)+" "+user); System.out.println(System.identityHashCode(user1)+" "+user1); user.getAddress().setAddress("beijing"); System.out.println(user.hashCode()+" "+user); System.out.println(user1.hashCode()+" "+user1); }
只修改 user,但 user1 也被修改
clone() 方法:属性为基本类型拷贝其值,属性为非基本类型拷贝其引用
深拷贝
public class Address implements Cloneable { private String address; @Override public Object clone() throws CloneNotSupportedException { return super.clone(); }
public class User implements Cloneable { private Integer id; private String name; private Integer age; private Address address; @Override public Object clone() throws CloneNotSupportedException { Object clone = super.clone(); Object addressClone = ((User) clone).getAddress().clone(); ((User) clone).setAddress((Address) addressClone); return clone; }
再测试
实现完整的深拷贝,需要被复制对象的继承链、引用链上的每一个对象都实现克隆机制
被克隆的对象的属性都是基本类型,那只需要被克隆类实现 cloneable 接口即可,若对象的属性包含其他非基本类型对象,那么这些非基本类型的对象都需要实现 cloneable 接口