浅克隆
被克隆对象的所有变量都含有与原来的对象相同的值,
而所有的对其他对象的引用仍然指向
原来的对象。换言之,浅克隆仅仅克隆所考虑的对象,而不克隆它所引用的对象。
package fun;
public class b extends a implements Cloneable {
public static void main(String[] args) throws CloneNotSupportedException {
b b=new b();
b b1=(fun.b) b.clone();//调用clone的方法,返回Object类,需要强转
b1.fun();
b.fun();
}private void fun() {
System.out.println("123");
}
@Override//复写clone的方法
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
深克隆
被克隆对象的所有变量都含有与原来的对象相同的值,
除去那些引用其他对象的变量。
那些
引用其他对象的变量将指向被克隆过的新对象,
而不再是原有的那些被引用的对象。
换言之,
深克隆把要克隆的对象所引用的对象都克隆了一遍。
package Test;
public class Pet implements Cloneable{
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}}
class zoo implements Cloneable{
private String name;
private Pet p=new Pet();
public zoo(String name) {
super();
this.name = name;
}
public zoo() {
super();
}
@Override
protected Object clone() throws CloneNotSupportedException {
zoo z= (zoo) this.clone();
Pet p1= (Pet) z.p.clone();
return z;
}
public static void main(String[] args) {
try {
zoo z= new zoo();
z.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}