JavaSE知识集锦深拷贝与浅拷贝

Posted tanxiaxuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaSE知识集锦深拷贝与浅拷贝相关的知识,希望对你有一定的参考价值。

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了。

以上是关于JavaSE知识集锦深拷贝与浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章

js中的深拷贝与浅拷贝

深拷贝与浅拷贝

深拷贝与浅拷贝

构造函数-深拷贝与浅拷贝

javaScript之深拷贝与浅拷贝

Python中的深拷贝与浅拷贝