浅克隆: 浅克隆是指在复制对象时,只会复制对象本身的基本数据类型或不可变类型的字段,对于对象引用类型的字段,则不会创建新的副本,而是让克隆出来的对象和原对象共享同一个引用。这意味着如果修改了克隆对象中的引用类型数据,原对象中的相应数据也会受到影响。
例如: User user1 = new User(); User user2 = user1;
这里,user2
实际上是 user1
的一个引用,而不是一个新的 User
对象。
浅克隆代码示例:
public class User { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + '}'; }}
Main 示例:
public class TestMain { public static void main(String[] args) throws CloneNotSupportedException { User user = new User(); user.setId(1); user.setName("AAA"); User user2 = user; user2.setName("BBB"); System.out.println(user); System.out.println(user2); }}
运行结果:
User{id=1, name='BBB'} User{id=1, name='BBB'}
深克隆: 深克隆不仅复制对象本身,还会递归地复制对象中所有的引用类型成员,确保克隆出来的对象与原对象完全独立,互不影响。这通常用于复杂对象的复制,以避免因共享引用而导致的数据一致性问题。
实现深克隆的方法包括但不限于:实现 Cloneable
接口并重写 clone()
方法,使用序列化机制等。
深克隆步骤:
- 对象的类实现
Cloneable
接口(这是必要的,否则会抛出 CloneNotSupportedException
异常); - 覆盖
Object
类的 clone()
方法(将访问权限设置为 public
,默认为 protected
); - 在重写的
clone()
方法中调用 super.clone()
。
深克隆示例:
public class User implements Cloneable { private Integer id; private String name; // Getters and Setters @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + '}'; } @Override public User clone() throws CloneNotSupportedException { return (User) super.clone(); } }
Main 示例:
public class TestMain { public static void main(String[] args) throws CloneNotSupportedException { User user = new User(); user.setId(1); user.setName("AAA"); User user2 = user.clone(); user2.setName("BBB"); System.out.println(user); System.out.println(user2); }}
运行结果:
User{id=1, name='AAA'} User{id=1, name='BBB'}