实现对象的深度克隆

1.方式一

实现Cloneable接口并重写 Object类中的 clone()方法

2. 方式二

(实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆)

2.1 User类和Car的准备

package cn.qdm.ceshi;

import java.io.Serializable;

public class User  implements Serializable{
    private String name;
    private Integer age;

    private Car car; //开的车

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + ", car=" + car + "]";
    }

    public User(String name, Integer age, Car car) {
        super();
        this.name = name;
        this.age = age;
        this.car = car;
    }

    public User() {
        super();
        // TODO Auto-generated constructor stub
    }

}

package cn.qdm.ceshi;

import java.io.Serializable;

public class Car implements Serializable{
    private String brand; //品牌

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    @Override
    public String toString() {
        return "Car [brand=" + brand + "]";
    }

    public Car(String brand) {
        super();
        this.brand = brand;
    }

    public Car() {
        super();
        // TODO Auto-generated constructor stub
    }

}

2.2 克隆工具类的准备

package cn.qdm.ceshi;

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

public class MyUtil {

    private MyUtil() {
        throw new AssertionError();
    }
    //实现深度克隆的工具方法

    public static<T extends Serializable> T clone(T obj) throws Exception{
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bout);
            oos.writeObject(obj);
            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bin);
            return (T) ois.readObject();
            //ByteArrayOutputStream和ByteArrayInputStream是基于内存的流只要垃圾回收器清理对象就能够释放资源,不同于外部资源(如文件流)的释放

    }
}

2.3 测试类

package cn.qdm.ceshi;

public class CloneTest {
    public static void main(String[] args) {
        User user1 = new User("张三", 18, new Car("BYD"));
        //深度克隆
        try {
            User user2 = MyUtil.clone(user1);
            //修改克隆对象user2的关联汽车属性
            user2.getCar().setBrand("迈凯伦P1");
            //打印原来对象不影响关联对象
            System.out.println(user1);
            System.out.println(user2);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

2.4 运行结果

3.注意:

基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的是用过泛型限定,可以检查出
要克隆的对象是否支持序列化,这项检查是编译器完成的,不是在运行时抛出异常,这种方案明显
优于使用Obeject类的clone方法克隆对象,让问题在编译的时候就暴露出来

原文地址:https://www.cnblogs.com/qdmpky/p/11986437.html

时间: 2024-08-02 15:36:39

实现对象的深度克隆的相关文章

JavaScript实现对象的深度克隆【简洁】【分享】

JavaScript实现对象的深度克隆 代码实现如下: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>clone</title> 6 7 <script type="text/javascript"> 8 //对象深度克隆方法 9 10 11 ////

javascript中对象的深度克隆

零.寒暄 又是一个月多月没有更新博客了,这段时间回学校处理下论文的事情,实习的生活也暂时告一段落(在公司上班,才发现学校里面的生活简直如天堂一般,相信很多已经毕业的小伙伴肯定被我说中了,说中了请给本文点个赞,哈哈!).希望接下来自己的更新进度能加快,马上又是一年校招时,被虐也好.大牛虐别人也罢,总之祝福各位今年要找工作的小伙伴们好运.那么,今天就聊一下一个常见的笔试.面试题,js中对象的深度克隆.翻了下这个题目,在很多地方出现过,已经算一个老的题目了,但是每年的校招中总会考到,其实想想,这个题目

JAVA对象任意深度克隆clone工具类分享

原文:JAVA对象任意深度克隆clone工具类分享 源代码下载地址:http://www.zuidaima.com/share/1550463408114688.htm package com.zuidaima.n_app.util; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import jav

JAVA对象的深度克隆

有时候,我们需要把对象A的所有值复制给对象B(B = A),但是这样用等号给赋值你会发现,当B中的某个对象值改变时,同时也会修改到A中相应对象的值! 也许你会说,用clone()不就行了?!你的想法只对了一半,因为用clone()时,除了基础数据和String类型的不受影响外,其他复杂类型(如集合.对象等)还是会受到影响的!除非你对每个对象里的复杂类型又进行了clone(),但是如果一个对象的层次非常深,那么clone()起来非常复杂,还有可能出现遗漏! 既然用等号和clone()复制对象都会对

JavaScript对象之深度克隆

也不知道从什么时候开始,前端圈冒出了个新词:对象深度克隆.看起来好像很高大上的样子,实际上并不新鲜,在我们的实际项目开发中,你可能早已用到,只不过由于汉字的博大精深,有些原本很简单的事物被一些看似专业的词汇稍加修饰,就变得神秘起来了. 首先为什么要将一个对象进行深克隆?请允许我进行一个猜测:你有时一定会认为js的内置对象document太长,那么你可能会这样做: var d = document; d.by = function(id){ return d.getElementById(id);

javascript对象的深度克隆

在做项目的时候需要向对象里面添加新属性,又不想修改原对象.于是就写: var newObj = oldObj,但是新对象属性改变后就对象也会跟着改变,这是因为无论是新对象还是旧对象,指向的内存地址都是一样的,改变了谁都改变了 内存中的数据. 于是找到了一个取巧的方法就是先把旧对象转化为字符串 然后 在转化为对象给新对象,虽然可以达到效果,但是总感觉有点不正规.于是想到了深度克隆 function cloneObjectFn (obj){ // 对象复制 return JSON.parse(JSO

对象的深度克隆

1 function clone(obj) { 2 var buf; 3 if(obj instanceof Array){ //被克隆的对象是数组 4 buf = []; 5 var i = obj.length; 6 while(i--){ 7 buf[i] = clone(obj[i]); 8 } 9 return buf; 10 }else if(obj instanceof Object){ //被克隆的对象是对象 11 buf = {}; 12 for (var k in obj){

JS对象的深度克隆——JavaScript代码实现

1 function clone(Obj) { 2 var buf; 3 if (Obj instanceof Array) { 4 buf = []; // 创建一个空的数组 5 var i = Obj.length; 6 while (i--) { 7 buf[i] = clone(Obj[i]); 8 } 9 return buf; 10 } 11 else if (Obj instanceof Object){ 12 buf = {}; // 创建一个空对象 13 for (var k

js学习随笔一:对象简单、深度克隆(复制)

javascript的一切实例都是对象,只是对象之间稍有不同,分为原始类型和合成类型.原始类型对象指的是字符串(String).数值(Number).布尔值(Boolean),合成类型对象指的是数组(Array).对象(Object).函数(Function). 既然对象分为这两类,他们之间的最大差别是复制克隆的差别.普通对象存储的是对象的实际数据,而引用对象存储的是对象的引用地址,而把对象的实际内容单独存放,因为引用对象通常比较庞大,这是数据开销和内存开销优化的手段.通常初学者很难理解这部分内