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
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
解决方案 »
- 我在my eclipse中打jar包时,打成了但是却没有图片,我想问一下怎么在上面打包,怎么把图片也带上!!!
- 一个关于"&"的疑问
- java.lang.reflect.*包为什么起"reflect"这个名字?
- 为什么 我写的程序 不能输出 空格了
- 我用java写的排序二叉树,谁帮我把遍历方法写出来?
- 数组问题
- Jta能否做到
- 求助:关于HashMap get()返回为空
- 怎么能让相同的告警信息不重复的发送给相同的用户,急啊!!!请各位高手指点迷津啊!!!
- javascript的函数如何在HTML中使用求大神指教
- JTable中如何在一个Cell使同时显示多种颜色或字体的字符?
- 关于多肽的问题
应该是输出为
abc
abc
abc
dddddddd
浅clone指向同一个引用,为什么不是
abc
abc
dddddddd
dddddddd
浅clone指向同一个引用指:
Class A {
String s ="abc";
}
Class B {
A a = new A();
}当你clone一个B的对象的时候,clone后的对象和原对象的a指向同一个引用。
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)); }
}
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,这是一个特殊的类,每次都会产生新的引用,容易误导
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);}
}
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);}
}
对象是引用,基本数据类型的应该不是。楼主不是不明白引用,应该是浅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()的时候,该对象内的对象的引用不变。