Java的浅拷贝与深拷贝

对于基本类型来说,它们之间的复制很简单,比如

class D{
	private int i = 2;
	public String toString() {
		return i+"";
	}
	public void setI(int d) {
		this.i = d;
	}
}

public class TestCase {
	
	public static void main(String[] args) {
		int i = 1;
		int j = i;
		i++;
		System.out.println("i="+i); // i = 2
		System.out.println("j="+j); // j = 1
		D d1 = new D();
		D d2 = d1;
		System.out.println("d1.i= "+d1); //d1 = 2 
		System.out.println("d2.i= "+d2); //d2 = 2
		System.out.println("修改d1 的值");
		d1.setI(3);
		System.out.println("d1.i= "+d1); // d1 = 3
		System.out.println("d2.i= "+d2); // d2 = 3
	}

}
从上面可以看出,对于i 和 j 是完全不同两个变量,但对于 d1 和 d2 来说 他们是完全相同的.对于对象的复制 Java在object 类中提供了clone() 方法 .在子类中覆盖此方法,就可以实现对象的复制. 该对象必须实现Cloneable 接口,否则会抛CloneNotSupportedException继承自java.lang.Object类的clone()方法是浅复制。

class E{
	private int j;
	
	public E(int j){
		this.j = j;
	}
	public String toString() {
		return j+"";
	}
	public void SetJ(int j) {
		this.j = j;
	}
}


class D implements Cloneable {
	private int i = 2;
	private E d = new E(4);
	public String toString() {
		return i+"";
	}
	public void setI(int d) {
		this.i = d;
	}
	public String getString() {
		return d.toString();
	}
	public E getE() {
		return d;
	}
	public D clone() throws CloneNotSupportedException{
		return (D) super.clone();
	}
}

public class TestCase {
	
	public static void main(String[] args) throws CloneNotSupportedException {
		D d1 = new D();
		D d2 = d1.clone();
		System.out.println("d1.i= "+d1);  //d1.i = 2
		System.out.println("d2.i= "+d2); //d2.i = 2
		d1.setI(4);
		System.out.println("d1.i= "+d1); //d1.i = 4
		System.out.println("d2.i= "+d2); //d2.i = 2
		
		System.out.println("d1.e.j= "+d1.getString());  //d1.e.j = 4
		System.out.println("d2.e.j= "+d2.getString());  //d1.e.j = 4
		E e = d1.getE();
		e.SetJ(6);
		System.out.println("d1.e.j= "+d1.getString()); //d1.e.j = 6
		System.out.println("d2.e.j= "+d2.getString()); //d1.e.j = 6
	}
}
对于基本类型复制值,类类型复制引用.所以修改d1的E对象状态(j),会修改所有从d1克隆出来的对象的E的状态.因而我们需要深拷贝

class E implements Cloneable{
	private int j;
	
	public E(int j){
		this.j = j;
	}
	public String toString() {
		return j+"";
	}
	public void SetJ(int j) {
		this.j = j;
	}
	public E clone() throws CloneNotSupportedException{
		return (E) super.clone();
	}
}


class D implements Cloneable {
	private int i = 2;
	private E d = new E(4);
	public String toString() {
		return i+"";
	}
	public void setI(int d) {
		this.i = d;
	}
	public String getString() {
		return d.toString();
	}
	public E getE() {
		return d;
	}
	public D clone() throws CloneNotSupportedException{
		D d1 = (D)super.clone();
	    d1.d=d.clone();    
	   return d1;    
	}
}

public class TestCase {
	
	public static void main(String[] args) throws CloneNotSupportedException {
		D d1 = new D();
		D d2 = d1.clone();
		System.out.println("d1.i= "+d1);  //d1.i =2  
		System.out.println("d2.i= "+d2);  //d1.i = 2
		d1.setI(4);
		System.out.println("d1.i= "+d1); // d1.i = 4
		System.out.println("d2.i= "+d2); //d2.i = 2
		
		System.out.println("d1.e.j= "+d1.getString()); //d1.e.j = 4
		System.out.println("d2.e.j= "+d2.getString()); //d2.e.j = 4
		E e = d1.getE();
		e.SetJ(6);
		System.out.println("d1.e.j= "+d1.getString()); //d1.e.j =6
		System.out.println("d2.e.j= "+d2.getString()); //d2.e.j = 4
	}
}




posted @ 2017-02-27 22:33  michaelzix  阅读(102)  评论(0)    收藏  举报