package test;public class CloneTest1 implements Cloneable { java.util.Date date;
String s = "abc";
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException ex) { return null;
}
} public static void main(String[] args){
CloneTest1 src=new CloneTest1(); 
CloneTest1 des=(CloneTest1)src.clone(); 
System.out.println(src.s);
System.out.println(des.s);
des.s = "dddddddd";
System.out.println(src.s);
System.out.println(des.s);

}
}
为什么输入为
abc
abc
abc
dddddddd
浅clone指向同一个引用,为什么不是
abc
abc
dddddddd
dddddddd

解决方案 »

  1.   

    对不起搞错了
    应该是输出为
    abc
    abc
    abc
    dddddddd
    浅clone指向同一个引用,为什么不是
    abc
    abc
    dddddddd
    dddddddd
      

  2.   

    就应该是这个样子。
    浅clone指向同一个引用指:
    Class A {
      String s ="abc";
    }
    Class B {
      A a = new A();
    }当你clone一个B的对象的时候,clone后的对象和原对象的a指向同一个引用。
      

  3.   

    import java.util.*;
    public class CloneTest1 implements Cloneable { java.util.Date date;
    String s = "abc";
    int a[] = new int[]{1,2,3}; public Object clone() {
    try {
    return super.clone();
    } catch (CloneNotSupportedException ex) { return null;
    }
    } public static void main(String[] args) {
    CloneTest1 src = new CloneTest1();
    CloneTest1 des = (CloneTest1) src.clone();
    System.out.println(Arrays.toString(src.a));
    System.out.println(Arrays.toString(des.a));
    des.a[2]=1111;
    System.out.println(Arrays.toString(src.a));
    System.out.println(Arrays.toString(des.a)); }
    }
      

  4.   

    楼主要理解引用的意思
    des.s = "dddddddd";你这样的话只是改变des.s的引用,但是src.s的引用不会改变,src.s引用的那块内存不会改变,你要做的应该是修改所引用的内存的值,而不是重新去引用一块新的内存//1
    //des.s->memory1("abc")
    //src.s->memory1("abc")//2
    des.s = "dddddddd";
    src.s->memory1("abc")
    des.s->memory2("dddddddd")
    //两个引用互不影响,这时是两块内存空间了
    你再改成下面的试试看
    package clone;public class CloneTest1 implements Cloneable { java.util.Date date;
    StringBuffer s = new StringBuffer("abc");
    public Object clone() {
    try {
    return super.clone();
    } catch (CloneNotSupportedException ex) { return null;
    }
    } public static void main(String[] args){
    CloneTest1 src=new CloneTest1();
    CloneTest1 des=(CloneTest1)src.clone();
    System.out.println(src.s);
    System.out.println(des.s);
    des.s.append("_append");//这个不会改变引用,StringBuffer的append是在原来基础上修改
    System.out.println(src.s);
    System.out.println(des.s); }
    }
    //另外,做这种测试的时候,建议不要用String,这是一个特殊的类,每次都会产生新的引用,容易误导
      

  5.   

    把String改为int有怎么理解?
    public class CloneTest1 implements Cloneable {java.util.Date date;
    int s = 1;
    public Object clone() {
    try {
    return super.clone();
    } catch (CloneNotSupportedException ex) {return null;
    }
    }public static void main(String[] args){
    CloneTest1 src=new CloneTest1(); 
    CloneTest1 des=(CloneTest1)src.clone(); 
    System.out.println(src.s);
    System.out.println(des.s);
    des.s = 2;
    System.out.println(src.s);
    System.out.println(des.s);}
    }
      

  6.   

    把 String改为int又怎么解析,请各位继续好、指教!!
    public class CloneTest1 implements Cloneable {java.util.Date date;
    int s = 1;
    public Object clone() {
    try {
    return super.clone();
    } catch (CloneNotSupportedException ex) {return null;
    }
    }public static void main(String[] args){
    CloneTest1 src=new CloneTest1(); 
    CloneTest1 des=(CloneTest1)src.clone(); 
    System.out.println(src.s);
    System.out.println(des.s);
    des.s =2;
    System.out.println(src.s);
    System.out.println(des.s);}
    }
      

  7.   

    des.s =2;这个都是把s指向另一块内存,而不是修改目前所引用的内存
      

  8.   

    不同意楼上的说法。
    对象是引用,基本数据类型的应该不是。楼主不是不明白引用,应该是浅clone。public class CloneTest1 implements Cloneable {java.util.Date date;
    int s = 1;
    public Object clone() {
    try {
    return super.clone();
    } catch (CloneNotSupportedException ex) {return null;
    }
    }public static void main(String[] args){
    CloneTest1 src=new CloneTest1();
    CloneTest1 des=(CloneTest1)src.clone();
    System.out.println(src);//这改了
    System.out.println(des);//这也改了
    des.s =2;
    System.out.println(src.s);
    System.out.println(des.s);}
    }浅和深clone()的时候,都在内存中开辟了一块空间,和原来的对象一样。浅clone()的时候,该对象内的对象的引用不变。