Java 对象深浅拷贝

发布时间:2018-06-09作者:laosun阅读(725)

Java

Java 对象深浅拷贝:浅拷贝只复制一个对象(包括基本类型),对象内部存在的指向其他对象数组或者引用则不复制 ,拷贝后两个指针指向同一个内存空间,类似于文件创建快捷方式。深拷贝:对象以及对象内部的引用均复制,深拷贝后指针指向两个不同地址,重新new一个一模一样的对象,深拷贝的两个对象完全独立,解决不能管理子对象的问题的。

    浅拷贝只复制一个对象(包括基本类型),对象内部存在的指向其他对象数组或者引用则不复制 ,拷贝后两个指针指向同一个内存空间,类似于文件创建快捷方式。

    Person person = new Person("sunjs",100);
    Person person1 = person;

    调用Object的Clone的函数(也是浅拷贝)

    Person person = new Person("sunjs",100);
    Person person1 =(Person) person.clone();


    这里再补充一下,发现很多人有误解:

    如果我们有个对象Student,里边有String、int或者其他数据类型。还有一个引用对象。

    那么浅拷贝后,Student对象中的String、int等基本数据类型修改,不会影响拷贝后的对象的内容。但是引用对象的修改会影响。
    手写例子:

    public class Student{
        private String name;
        private int age;
        private booolean flag;
        private Student2 student2;//这种叫做引用对象。浅拷贝后,修改任意一个对象的student2都会对应的进行修改,因为没有拷贝这个对象所占用的内存空间,使用的还是一份
        //但是 修改name,age,flag等基本数据类型,互不影响。
        //set get
        //
    }

    深拷贝:对象以及对象内部的引用均复制,深拷贝后指针指向两个不同地址,重新new一个一模一样的对象,深拷贝的两个对象完全独立,解决不能管理子对象的问题的。

    Person person = new Person("sunjs",100);
    Person person1 =(Person) person.deepClone();

    推荐使用序列化实现对象的拷贝

    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    
    public class CloneUtils {
    
    	// 拷贝一个对象
    
    	@SuppressWarnings("unchecked")
    	public static <T extends Serializable> T clone(T obj) {
    		// 拷贝产生的对象
    		T clonedObj = null;
    		try {
    			// 读取对象字节数据
    			ByteArrayOutputStream baos = new ByteArrayOutputStream();
    			ObjectOutputStream oos = new ObjectOutputStream(baos);
    			oos.writeObject(obj);
    			oos.close();
    			// 分配内存空间,写入原始对象,生成新对象
    			ByteArrayInputStream bais = new ByteArrayInputStream(
    					baos.toByteArray());
    			ObjectInputStream ois = new ObjectInputStream(bais);
    			// 返回新对象,并做类型转换
    			clonedObj = (T) ois.readObject();
    			ois.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return clonedObj;
    	}
    
    }


0 +1

版权声明

 Java  源码

 请文明留言

0 条评论