public class A implements Cloneable{
//为了方便测试,以下变量都用public修饰
public int num;
public String name;
public String[] nickNames=new String[2];
public B b=new B();
public A clone(){
A a=null;
try{
a=(A)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return a;
}
}
public class B {
//为了方便测试,变量用public修饰
public String name;
}
public class C {
public static void main(String[] args){
A a1=new A();
//给a1的属性设值
a1.num=10;
a1.name="a1";
a1.nickNames[0]="a1-1";
a1.nickNames[1]="a1-2";
a1.b.name="a1.b";
//打印a1
System.out.println("a1克隆前:");
print(a1);
A a2=a1.clone();
//给a2属性设值
a2.num=20;
a2.name="a2";
a2.nickNames[0]="a2-1";
a2.nickNames[1]="a2-2";
a2.b.name="a2.b";
//打印a2
System.out.println("克隆对象a2:");
print(a2);
//再打印a1
System.out.println("a1克隆后:");
print(a1);
}
public static void print(A a){
System.out.println("num="+a.num+" name="+a.name+" nickNames[0]="+a.nickNames[0]
+" nickNames[1]="+a.nickNames[1]+" b.name="+a.b.name);
}
}
public class A implements Cloneable{
//为了方便测试,以下变量都用public修饰
public int num;
public String name;
public String[] nickNames=new String[2];
public B b=new B();
public A clone(){
A a=null;
try{
a=(A)super.clone();
a.nickNames=new String[this.nickNames.length];//重新new一个
System.arraycopy(this.nickNames, 0, a.nickNames, 0, this.nickNames.length);//复制
a.b=(B)this.b.clone();//B克隆
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return a;
}
}
由于A中对B进行了克隆,所以B也必须实现接口Cloneable
public class B implements Cloneable{
//为了方便测试,变量用public修饰
public String name;
public B clone(){
B b=null;
try{
b=(B)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return b;
}
}