浅谈java深浅拷贝

在一个论坛上看到了一个关于深浅拷贝的文章,引用地址: http://bbs.itcast.cn/thread-14646-1-2.html
概念:
(1)浅拷贝(浅克隆)被复制对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用仍然只指向原来的对象。
(2)深拷贝(深克隆)被复制对象的所有变量都含有与原来的对象相同的值,那些引用其他对象的变量将指向被复制过的新对象,深复制把要复制的对象所引用的对象都复制了一遍。
实现拷贝需要实现Cloneable接口并且重写clone方法。
(1)如果类型仅包含值类型(int,byte等类型)和string类型的数据成员,我们只要在clone方法中初始化一个新的对象,并调用超类的方法clone方法。
(2)如果自定义类型包含引用类型的数据成员,必须考虑clone方法是实现浅拷贝(shallow copy)还是深拷贝(deep copy)。
话不多说:贴代码:
package test.clone;
public class Person implements Cloneable{
	String name;
	String age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	@Override
    public Object clone()  {
		Person p=null;   
	    try{   
	    	p=(Person) super.clone();   
	    }catch(CloneNotSupportedException e)   {   
	    	e.printStackTrace();
	    }  
	    return p; 
     }    
}
package test.clone;
public class Student implements Cloneable{
	Person person;
	String klass;
	public Person getPerson() {
		return person;
	}
	public void setPerson(Person person) {
		this.person = person;
	}
	public String getKlass() {
		return klass;
	}
	public void setKlass(String klass) {
		this.klass = klass;
	}
	@Override
    public Object clone() {
        Student obj = null;
        try {
            obj = (Student) super.clone();
        } catch (CloneNotSupportedException ex) {
            ex.printStackTrace();
        }
        obj.person=(Person)person.clone();//如果没有这句则属于浅拷贝;读者可以自行测试
        return obj;
    }
}
package test.clone;
public class TestClone {
	public static void main(String[] args) {
		Student s1=new Student();
		Person p1=new Person();
		p1.setName("Student1");
		p1.setAge("21");
		s1.setKlass("class1");
		s1.setPerson(p1);
		Student s2=(Student) s1.clone();
		s2.getPerson().setName("Student2");
		System.out.println(s1.getPerson().getName()+"------克隆之前的Student1");
		System.out.println(s2.getPerson().getName()+"------克隆之后的Student2");
	}
}
运行结果:
Student1------克隆之前的Student1
Student2------克隆之后的Student2

你可能感兴趣的:(java,clone,深拷贝,浅拷贝)