欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浅谈java深浅拷贝

程序员文章站 2022-07-06 09:14:26
...
在一个论坛上看到了一个关于深浅拷贝的文章,引用地址: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