深浅clone问题

likgui 2007-08-10 05:51:38
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
...全文
268 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
南南北北 2007-08-10
  • 打赏
  • 举报
回复
不同意楼上的说法。
对象是引用,基本数据类型的应该不是。

楼主不是不明白引用,应该是浅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()的时候,该对象内的对象的引用不变。

believefym 2007-08-10
  • 打赏
  • 举报
回复
des.s =2;

这个都是把s指向另一块内存,而不是修改目前所引用的内存
believefym 2007-08-10
  • 打赏
  • 举报
回复
跟String一样理解
likgui 2007-08-10
  • 打赏
  • 举报
回复
把 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);

}
}
likgui 2007-08-10
  • 打赏
  • 举报
回复
把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);

}
}
awusoft 2007-08-10
  • 打赏
  • 举报
回复
改变的是引用变量本身,而不是改变引用对像的值
believefym 2007-08-10
  • 打赏
  • 举报
回复
楼主要理解引用的意思
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,这是一个特殊的类,每次都会产生新的引用,容易误导
believefym 2007-08-10
  • 打赏
  • 举报
回复
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));

}
}
南南北北 2007-08-10
  • 打赏
  • 举报
回复
就应该是这个样子。
浅clone指向同一个引用指:
Class A {
String s ="abc";
}
Class B {
A a = new A();
}

当你clone一个B的对象的时候,clone后的对象和原对象的a指向同一个引用。
likgui 2007-08-10
  • 打赏
  • 举报
回复
对不起搞错了
应该是输出为
abc
abc
abc
dddddddd
浅clone指向同一个引用,为什么不是
abc
abc
dddddddd
dddddddd

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧