Clone中存在的浅克隆问题

A.java

package second;

public class A {
String country;//国家
String province;//地区
String city;//城市
public A(String country,String province,String city){
this.country = country;
this.province = province;
this.city = city;
}
}

B.java

package second;

public class B implements Cloneable {
String name;//姓名
int age;//年龄
A addr;//定义地址
/**
* 构造方法
* @param name 姓名
* @param age 年龄
* @param addr 指向A的地址集
*/
public B (String name,int age,A addr){
this.name = name;
this.age = age;
this.addr = addr;
}
/**
* 克隆方法
*/
public Object clone(){
B handler = null;
try{
handler = (B)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return handler;
}
}

C.java

package second;

public class C implements Cloneable {
public static void main(String[] args){
A a = new A("中国","北京","西雅图");
B b = new B("李四",22,a);
System.out.println(b.name+":"+b.addr.country+b.addr.province+b.addr.city);
B bclone = (B)b.clone();
bclone.addr.country = "美国";
bclone.addr.province = "佛罗里达州";
bclone.addr.country = "罗德里格斯";
System.out.println(bclone.name+":"+bclone.addr.country+bclone.addr.province+bclone.addr.city);
System.out.println(b.name+":"+b.addr.country+b.addr.province+b.addr.city);
}
}

输出:

李四:中国北京西雅图
李四:罗德里格斯佛罗里达州西雅图
李四:罗德里格斯佛罗里达州西雅图

PS::可见即使通过克隆的方法,如果有变量指向的是一个可变的变量;原对象跟克隆后的对象中的可变对象(变量)仍然是指向的同一个内存地址:;

解决方法,重新构造一组可变的变量,这样就不会覆盖原地址的数据

C.java

package second;

public class C implements Cloneable {
public static void main(String[] args){
A a = new A("中国","北京","西雅图");
B b = new B("李四",22,a);
System.out.println(b.name+":"+b.addr.country+b.addr.province+b.addr.city);
B bclone = (B)b.clone();
A a1 = new A("美国","佛罗里达州","罗德里格斯");
bclone.addr = a1;
System.out.println(bclone.name+":"+bclone.addr.country+bclone.addr.province+bclone.addr.city);
System.out.println(b.name+":"+b.addr.country+b.addr.province+b.addr.city);
}
}

结果:

李四:中国北京西雅图
李四:美国佛罗里达州罗德里格斯
李四:中国北京西雅图
上一篇:c语言内存模型


下一篇:《数据结构》 java的一维数组的内存结构与其特性