关于java中的深copy与浅copy的有关问题

关于java中的深copy与浅copy的问题
前几天老师让同学们讲一讲设计模式中的原型模式,主要是涉及到了java中的深copy与浅copy的问题.很多同学都没搞清楚,所以今天我做了一个总结:
首先写一个daugter类,在下面作为Teacher的一个对象:
package com.zhaole;

import java.io.Serializable;

public class Daugter implements Serializable{
	public String name="asdf";

}

 

然后写个Teacher类,分别实现Serializable,Cloneable接口。

 

package com.zhaole;

import java.io.Serializable;

public class Teacher implements Serializable,Cloneable {
	public String name="lele";
	Daugter da=new Daugter();
	@Override
	public Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		return super.clone();
	}

}

 

写一个测试类: 

package com.zhaole;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Test {
	Teacher t=new Teacher();
	public static Teacher copy(Teacher t){
		 Teacher ob=null;
			try {
				
				ByteArrayOutputStream baos=new ByteArrayOutputStream();
				ObjectOutputStream	oos=new ObjectOutputStream(baos);
				oos.writeObject(t);
				oos.flush();
				oos.close();
				ByteArrayInputStream bais=new ByteArrayInputStream(baos.toByteArray());
				ObjectInputStream ois=new ObjectInputStream(bais);
				ob=(Teacher)ois.readObject();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		 return ob;
		
	}
 
	public static void main(String[] args){
		Test s=new Test();
		Teacher t=new Teacher();
		System.out.println("<<<<<<<<<<<<<<<<<浅copy>>>>>>>>>>>>>>>");
		try {
			Teacher b=(Teacher)t.clone();
			if(b!=t){
				System.out.println("不是同一个对象");
				if(b.da==t.da){
					System.out.println("<<<<<<<<<<<<<<下一层>>>>>>>>>>>");
					System.out.println("是同一个对象");
				}else{
					System.out.println("<<<<<<<<<<<<<<下一层>>>>>>>>>>>");
					System.out.println("不是同一个对象");
				}
			}else{
				System.out.println("是同一个对象");
				if(b.da==t.da){
					System.out.println("<<<<<<<<<<<<<<下一层>>>>>>>>>>>");
					System.out.println("是同一个对象");
				}else{
					System.out.println("<<<<<<<<<<<<<<下一层>>>>>>>>>>>");
					System.out.println("不是同一个对象");
				}
			}
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("<<<<<<<<<<<<深copy>>>>>>>>>>>>>>>>");
		if(t==Test.copy(t)){
			System.out.println("是同一个对象");
			if(t.da==Test.copy(t).da){
				System.out.println("<<<<<<<<<<<下一层 了>>>>>>>>>>>>>>>");
				System.out.println("是同一个对象");
			}
			else{
				System.out.println("<<<<<<<<<<<下一层 了>>>>>>>>>>>>>>>");
				System.out.println("不是同一个对象");
			}
			
		}
		else{
			System.out.println("不是同一个对象了");
			if(t.da==Test.copy(t).da){
				System.out.println("<<<<<<<<<<<下一层 了>>>>>>>>>>>>>>>");
				System.out.println("是同一个对象");
			}else{
				System.out.println("<<<<<<<<<<<下一层 了>>>>>>>>>>>>>>>");
				System.out.println("不是同一个对象");
			}
		}
	}

}

测试结果: 

<<<<<<<<<<<<<<<<<浅copy>>>>>>>>>>>>>>>
不是同一个对象
<<<<<<<<<<<<<<下一层>>>>>>>>>>>
是同一个对象
<<<<<<<<<<<<深copy>>>>>>>>>>>>>>>>
不是同一个对象了
<<<<<<<<<<<下一层 了>>>>>>>>>>>>>>>
不是同一个对象

 总结:

从上面的结果可以明显得出这样一个结论,java中的浅copy,也就是用clone方法实现的,只是复制了个当前实例,但是对实例中的各个对象并没有实现复制,只是获得了对该实例中的对象的引用。而深复制不仅仅实现了对当前实例的复制,并且还把实例中的所有对象都逐一进行复制。

1 楼 Technoboy 2011-05-10  
http://technoboy.iteye.com/blog/1032533