Java的克隆是通过实现Cloneable接口并重写Clone函数来实现的。
克隆有浅克隆与深克隆之分:
- 浅克隆:原对象与克隆的对象的引用不同,但其内部成员的引用相同;
- 深克隆:原对象与克隆的对象的引用不同,其内部成员的引用也不同。
浅克隆代码示例:
class A implements Cloneable{
B b;
A(B b){
this.b = b;
}
@Override
public Object clone() throws CloneNotSupportedException{
Object object = super.clone();
return object;
}
}
class B{
}
public class Test{
public static void main(String[] args) throws CloneNotSupportedException {
B b = new B();
A a1 = new A(b);
A a2 = (A)a1.clone(); // 克隆的对象
System.out.println(a1 == a2);
System.out.println(a1.b == a2.b);
}
}
运行结果:
false
true
深克隆的代码示例:
class A implements Cloneable{
B b;
A(B b){
this.b = b;
}
@Override
public Object clone() throws CloneNotSupportedException{
A a = (A)super.clone();
a.b = (B)b.clone(); // 对成员b也进行一次克隆
return a;
}
}
class B implements Cloneable{
@Override
public Object clone() throws CloneNotSupportedException{
Object object = super.clone();
return object;
}
}
public class Test{
public static void main(String[] args) throws CloneNotSupportedException {
B b = new B();
A a1 = new A(b);
A a2 = (A)a1.clone(); // 克隆的对象
System.out.println(a1 == a2);
System.out.println(a1.b == a2.b);
}
}
运行结果:
false
false