在Java中,克隆一个实体类对象可以通过以下三种方法实现:
实现Cloneable接口并重写clone()方法
实现Cloneable接口是一个标记,表示该类可以被克隆。
在类中重写clone()方法,并调用super.clone()来创建一个新的对象,然后将原始对象的属性值赋给新对象。
```java
public class MyClass implements Cloneable {
private int id;
private String name;
// constructor, getter, setter methods
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
// 使用
MyClass obj1 = new MyClass();
MyClass obj2 = (MyClass) obj1.clone();
```
使用构造方法进行克隆
在实体类中编写一个构造方法,接受一个同类型的对象作为参数,并将参数对象的属性值赋给新对象的属性。
```java
public class MyClass {
private int id;
private String name;
public MyClass(MyClass obj) {
this.id = obj.id;
this.name = obj.name;
}
// constructor, getter, setter methods
}
// 使用
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass(obj1);
```
实现深克隆
如果需要克隆的对象包含引用类型属性,并且希望克隆对象与原对象完全独立,则需要进行深克隆。
在clone()方法中递归地复制引用类型数据。
```java
public class CloneExample implements Cloneable {
private int value;
private List
public CloneExample(int value, List this.value = value; this.list = new ArrayList<>(list); // 使用ArrayList的构造方法进行浅拷贝 } @Override protected Object clone() throws CloneNotSupportedException { CloneExample cloned = (CloneExample) super.clone(); cloned.list = new ArrayList<>(this.list); // 进行深拷贝 return cloned; } } // 使用 CloneExample example1 = new CloneExample(10, Arrays.asList("a", "b", "c")); CloneExample example2 = (CloneExample) example1.clone(); example2.list.add("d"); System.out.println(example1.list); // 输出 [a, b, c] System.out.println(example2.list); // 输出 [a, b, c, d] ``` 建议 浅克隆适用于对象结构简单,且不需要完全独立的情况。 深克隆适用于对象结构复杂,且需要完全独立的情况。 实现深克隆时,务必注意递归复制所有引用类型属性,以确保克隆对象与原对象完全独立。