您的位置:首页 > 编程语言 > Java开发

JavaSE知识集锦(1)深拷贝与浅拷贝

2016-03-13 10:47 393 查看
1、关于深拷贝和浅拷贝

什么是拷贝?

Object类中有clone方法,是native的代码。但是如果不显式地重写clone方法,将不能直接调用。如果自定义的类没有实现Cloneable接口,将会抛出java.lang.CloneNotSupportedException错误。

拷贝的原理是在内存中新开辟一块区域,然后完全拷贝旧那块的内容到新那块去,无论是引用类型还是基本类型。
Notice:新clone出来的对象和原来不是一个对象,hashCode值是不一样的。

深拷贝与浅拷贝:

clone的一个危险的地方在于,拷贝引用类型时,拷贝的是引用,它们都指向同一块区域,这样很容易出现修改一个类,改变另一个类的情况。

class B {
int i = 2;
}

class A implements Cloneable {
B b = new B();
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

public class Source {

public static void main(String[] args) throws Exception {
A a = new A();
A b = (A) a.clone();
b.b.i = 1;
System.out.println(a.b.i);
}

}

输出结果是1,说明a指向的区域被b所改动。这就是所谓的浅拷贝。

要实现深拷贝,应该对类的每一个成员变量都显式调用clone。

class B implements Cloneable {
int i = 2;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

class A implements Cloneable {
B b = new B();
@Override
protected Object clone() throws CloneNotSupportedException {
A a = (A) super.clone();
a.b = (B) b.clone();
return (Object) a;
}
}

public class Source {

public static void main(String[] args) throws Exception {
A a = new A();
A b = (A) a.clone();
b.b.i = 1;
System.out.println(a.b.i);
}

}

现在输出结果是2了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java SE