//对象复制
public class A{
public static void main(String[] args){
B obj=new B(20,"Jack");
System.out.println("被复制的对象obj.age="+obj.age+"obj.name="+obj.name);

B objClone=(B)obj.clone();
objClone.age=30;
objClone.name="Joye";
System.out.println("被复制的对象objClone.age="+objClone.age+
"objClone.name="+objClone.name);

}
}class B implements Cloneable{
int age;
String name;
B(int age,String name){
this.age=age;
this.name=name;
}

public Object clone()throws CloneNotSupportedException{
try{
B obj=(B)super.clone();
}
catch(CloneNotSupportedException e){
System.err.println(e);
}
return obj;

}
}//请高书门帮忙修改此程序,并说出错误的原因
//谢了

解决方案 »

  1.   

    对clone()这个方法的应用比较模糊,请高手说明一下,给我上一课吧
    谢了
      

  2.   

    public class Test{
    public static void main(String[] args){
    B obj=new B(20,"Jack");
    System.out.println("被复制的对象obj.age="+obj.age+"obj.name="+obj.name);

    B objClone=(B)obj.clone();
    objClone.age=30;
    objClone.name="Joye";
    System.out.println("被复制的对象objClone.age="+objClone.age+
    "objClone.name="+objClone.name);
    System.out.println("被复制的对象obj.age="+obj.age+"obj.name="+obj.name);

    }
    }class B implements Cloneable{
    int age;
    String name;
    B obj;
    B(int age,String name){
    this.age=age;
    this.name=name;
    }

    public Object clone(){
    try{
       obj=(B)super.clone(); }
    catch(Exception e){
    System.err.println(e);
    }
    obj.name=name;
       return obj;
    }
    }
      

  3.   

    public Object clone() throws CloneNotSupportedException {
    try {
    B obj = (B) super.clone();
    return obj;
    } catch (CloneNotSupportedException e) {
    System.err.println(e);
    return null;
    }这个方法很明显就没有保证所有模块都有返回值,所以会出错
     至于clone()这个方法,有深复制,和浅复制之分,就复制就是
    完全重新生成一个对象,而且浅复制就是对原来对象的引用,我记得
    有一位高手是这样说的:(在哪里看到的我忘记了,也不想找了,请那位
    高人原谅)老师发布了一道作业,全班人只有小明做了,如果老师要检查作业
    那么大家都跑去跟小明借(小明也肯借),然后拿去给老师看,但是如果老师叫
    大家一起交上去,那么就完蛋了,这就叫做浅复制,为应付这种情况,大家都借小
    明的作业copy了一份,那么,如果要大家一起交也不怕了,这就叫深复制
    楼主的情况就是你借小明的作业,然后把小明的作业改了,所以输出也就改了
      

  4.   

    问题出在你的B的构造方法,它是带参数的构造方法,而clone()方法是通过调用默认的构造方法来返回一个对象的。当你自己写了一个构造方法的时候JAVA就不提供你默认的构造方法了。