对象克隆 :clone
先观察以下代码
class A{
private int k;
public int getK() {
return k;
}
public void setK(int k) {
this.k = k;
}
public A(int k){
this.k = k;
}
}
public class Test16 {
public static void main(String[] args){
A a = new A(3);
A b = a;
b.setK(4);
System.out.println(a.getK());
System.out.println(b.getK());
}
}
我们会发现这样将a引用赋值给b引用,并没有起到真正克隆的作用,它只是将b指向了a指向的那块内存中,所以改变b里的值,a也会被改变。
所以我们需要用到clone()来进行对象的克隆
诶??现在又发现了没有clone这个方法,用这个方法会报错。
所以我们要对clone这个方法进行重写
但是运行时又会报异常
这是因为这个类没有实现 Cloneable这个接口
我们通过查看源码发现
这个接口是个空接口!!
作用:标志位 flg 当前对象是否进行clone 如果不实现 JVM无法实现
class Money{
double money = 10.0;
}
class Person implements Cloneable{
public String name;
Money m;
public Person(String name){
this.name = name;
m = new Money();
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
//Person 重写
Person p = (Person)super.clone();
return p;
}
}
public class Test16 {
public static void main(String[] args) throws CloneNotSupportedException{
Person p1 = new Person("caocao");
Person p2 =(Person) p1.clone();
System.out.println(p1.m.money);
System.out.println(p2.m.money);
p1.m.money = 1000.0;
System.out.println(p1.m.money);
System.out.println(p2.m.money);
}
}
运行结果
我们发现这个改变了p2的值对应p1也变了,这个是因为我们只克隆了person对象,并没有克隆Money对象。因此我们需要在Money类里重写clone方法。
class Money implements Cloneable{
double money = 10.0;
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
//Cloneable 空接口(标志接口)
//作用:标志位 flg 当前对象是否进行clone 如果不实现 JVM无法实现
class Person implements Cloneable{
public String name;
Money m;
public Person(String name){
this.name = name;
m = new Money();
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
//Person 重写
Person p = (Person)super.clone();
p.m = (Money)this.m.clone();
return p;
}
}
public class Test16 {
public static void main(String[] args) throws CloneNotSupportedException{
Person p1 = new Person("caocao");
Person p2 =(Person) p1.clone();
System.out.println(p1.m.money);
System.out.println(p2.m.money);
p1.m.money = 1000.0;
System.out.println(p1.m.money);
System.out.println(p2.m.money);
}
}
运行结果